● 使用Unity Profiler查找程序中任何地方的瓶頸,并發(fā)現解決它們的方法。
● 實現C#腳本編寫的更佳實踐,避免常見誤區(qū)。
● 深入理解渲染管線,通過減少繪制調用和避免填充率瓶頸來更大化渲染管線的性能。
● 以大多數開發(fā)者都能理解的方式增強著色器,通過微妙而有效的性能調整優(yōu)化它們。
● 充分利用物理引擎使場景盡可能保持動態(tài)。
● 組織、過濾并壓縮藝術資源,保持高品質的同時更大化性能。
● 發(fā)現VR項目中各種嚴重的性能問題,找到解決它們的方法。
● 使用Mono框架和C#實現底層強化以更大化內存使用,避免垃圾回收。
● 了解項目組織的更佳實踐,通過改進工作流來節(jié)省時間。
Unity是一個令人驚嘆的游戲開發(fā)框架,它包含大量的特性集且易于使用,有助于將一些最炫酷的處理和渲染功能呈現給業(yè)余愛好者和專業(yè)人士。
本書展示了如何使用Unity 2017提升游戲性能,并演示高性能不僅局限于預算高的游戲。
由于沒有什么能比糟糕的用戶體驗更快地讓玩家遠離游戲,因此本書首先解釋了如何使用Unity Profiler檢測問題,學習如何使用秒表、計時器和日志方法診斷問題。
接著介紹Unity內置的批處理流程,它們何時能用于提升性能;分析將在運行時使用最小化的空間、CPU和內存導入藝術資源,并發(fā)掘一些未充分利用的特性和方法,來管理資源數據。
然后深入研究Unity3D引擎的底層,討論一些只有深入了解其內部工作原理的情況下才能理解的問題。
本書最后學習如何適當地組織資源來改進開發(fā)工作流,以及如何通過對象池快速有效地實例化資產。
用戶體驗在所有游戲中都是重要的組成部分,它不僅包括游戲的劇情和玩法,也包括運行時畫面的流暢性、與多人服務器連接的可靠性、用戶輸入的響應性,甚至由于移動設備和云下載的流行,它還包括最終程序文件的大小。由于Unity等工具提供了大量有用的開發(fā)功能,還允許獨立開發(fā)者訪問,游戲開發(fā)的門檻已經大大降低了。然而,由于游戲行業(yè)的競爭激烈,玩家對游戲最終品質的期望與日俱增,游戲的各方面應該能經得起玩家和評論家的考驗。
性能優(yōu)化的目標與用戶體驗密不可分。缺乏優(yōu)化的游戲會導致低幀率、卡頓、崩潰、輸入延遲、過長的加載時間、不一致以及令人不舒服的運行時行為,以及物理引擎的故障甚至過高的電池消耗(移動設備通常被忽略的指標)。只要遭遇上述問題之一,就是游戲開發(fā)者的噩夢,因為其他方面都做得很好,評論也只炮轟做得不好的一個方面。
性能優(yōu)化的目標之一是最大化地利用可用資源,包括CPU資源,如消耗的CPU循環(huán)數、使用的主存空間大小(稱為RAM),也包括GPU資源[GPU有自己的內存空間(稱為VRAM)]、填充率、內存帶寬等。然而,性能優(yōu)化最重要的目標是確保沒有哪個資源不合時宜地導致性能瓶頸,優(yōu)先級最高的任務得到優(yōu)先執(zhí)行。哪怕很小的、間歇性的停頓或性能方面的延遲都會破壞玩家的體驗,打破沉浸感,限制我們嘗試創(chuàng)建體驗的潛力。另一個需要考慮的事項是,節(jié)省的資源越多,便能夠在游戲中創(chuàng)造出更多的活動,從而產生更有趣、更生動的玩法。
同樣重要的是,要決定何時后退一步,停止增強性能。在一個擁有無限時間和資源的世界里,總會有另一種方法讓游戲變得更好、更快、更高效。在開發(fā)過程中,必須確定產品達到了可接受的質量水平。如果不這樣做,就會重復實現那些很少或沒有實際好處的變更,而每個變更都可能引入更多的bug。
判斷一個性能問題是否值得修復的最佳方法是回答“用戶會注意到它嗎?”。如果這個問題的答案是“不”,那么性能優(yōu)化就是白費力氣。軟件開發(fā)中有句老話:
蔡俊鴻,擁有多年游戲開發(fā)經驗,全程主導多個千萬級IP游戲的客戶端和服務器開發(fā)。擅長服務器和客戶端的架構設計以及性能優(yōu)化、客戶端渲染等。目前就職于昆侖萬維GameArk,擔任技術總監(jiān)一職。
Chris Dickinson,在英格蘭一個安靜的小角落里長大,對數學、科學,尤其是電子游戲滿懷熱情。他喜歡玩游戲并剖析游戲的玩法,并試圖確定它們是如何工作的。Chris在獲得電子物理學的碩士學位后,他飛到美國加州,在硅谷中心的科學研究領域工作。不久后,他不得不承認,研究工作并不適合他的性格。在四處投簡歷之后,他找到了一份工作,最終讓他走上了軟件工程的正確道路(據說,這對于物理學畢業(yè)生來說并不罕見)。
Chris是IPBX電話系統(tǒng)的自動化工具開發(fā)人員,這段時間的工作更適合他的性格,F在,他正在研究復雜的設備鏈,幫助開發(fā)人員修復和改進這些設備,并開發(fā)自己的工具。Chris學習了很多關于如何使用大型、復雜、實時、基于事件、用戶輸入驅動的狀態(tài)機的知識。在這方面,Chris基本上是自學成才的,他對電子游戲的熱情再次高漲,促使他真正弄清楚電子游戲是如何創(chuàng)建的。當他有足夠的信心時,他回到學校攻讀游戲和模擬編程的學士學位。當他獲得學位時,他已經在用C++編寫自己的游戲引擎(盡管還很初級),并在日常工作中經常使用這些技能。然而,如果想創(chuàng)建游戲,應該只是創(chuàng)建游戲,而不是編寫游戲引擎。因此,Chris選擇了他喜歡的公開發(fā)行的游戲引擎——一個稱為Unity3D的優(yōu)秀小工具-一并開始制作一些游戲。
經過一段時間的獨立游戲開發(fā),Chris遺憾地決定,這條特定的職業(yè)道路的要求并不適合他,但他在短短幾年積累的知識量,以大多數人的標準來看,都令人印象深刻,他喜歡利用這些知識幫助其他開發(fā)人員創(chuàng)建作品。從那以后,Chris編寫了一本關于游戲物理的教程(Learning Game Physics with Bullet Physics and OpenGL,Packt Publishing)和兩本關于Unity性能優(yōu)化的書籍。他娶了他一生的摯愛Jamie,并開始在加州圣馬特奧市的Jaunt公司工作,研究酷的現代技術,擔任測試領域的軟件開發(fā)工程師(SDET),這是一家專注于提供VR和AR體驗(例如360視頻)的虛擬現實/增強現實初創(chuàng)公司。
工作之余,Chris一直抵抗對棋盤游戲的沉迷(特別是《太空堡壘:卡拉狄加與血腥狂怒>),他癡迷于暴雪的《守望先鋒》和《星際爭霸2》,專注地盯著Unity新版本,在紙上勾畫出一組關于游戲的構思。
第1章 研究性能問題
1.1 UnityProfiler
1.1.1 啟動Profiler
1.1.2 Profiler窗口
1.2 性能分析的最佳方法
1.2.1 驗證腳本是否出現
1.2.2 驗證腳本次數
1.2.3 驗證事件的順序
1.2.4 最小化正在進行的代碼更改
1.2.5 最小化內部影響
1.2.6 最小化外部影響
1.2.7 代碼片段的針對性分析
1.3 關于分析的思考
1.3.1 理解Profiler工具
1.3.2 減少干擾
1.3.3 關注問題
1.4 本章小結
第2章 腳本策略
2.1 使用最快的方法獲取組件
2.2 移除空的回調定義
2.3 緩存組件引用
2.4 共享計算輸出
2.5 Update、Coroutines和Invoke Repeating
2.6 更快的Game Object空引用檢查
2.7 避免從Game Object取出字符串屬性
2.8 使用合適的數據結構
2.9 避免運行時修改Transform的父節(jié)點
2.10 注意緩存Transform的變化
2.11 避免在運行時使用Find()和Send Message()方法
2.11.1 將引用分配給預先存在的對象
2.11.2 靜態(tài)類
2.11.3 單例組件
2.11.4 全局消息傳遞系統(tǒng)
2.12 禁用未使用的腳本和對象
2.12.1 通過可見性禁用對象
2.12.2 通過距離禁用對象
2.13 使用距離平方而不是距離
2.14 最小化反序列化行為
2.14.1 減小序列化對象
2.14.2 異步加載序列化對象
2.14.3 在內存中保存之前加載的序列化對象
2.14.4 將公共數據移入Scriptable Object
2.15 疊加、異步地加載場景
2.16 創(chuàng)建自定義的Update()層
2.17 本章小結
第3章 批處理的優(yōu)勢
3.1 Draw Call
3.2 材質和著色器
3.3 Frame ebugger
3.4 動態(tài)批處理
3.4.1 頂點屬性
3.4.2 網格縮放
3.4.3 動態(tài)批處理總結
3.5 靜態(tài)批處理
3.5.1 Static標記
3.5.2 內存需求
3.5.3 材質引用
3.5.4 靜態(tài)批處理的警告
3.5.5 靜態(tài)批處理總結
3.6 本章小結
……
第4章 著手處理藝術資源
第5章 加速物理
第6章 動態(tài)圖形
第7章 虛擬速度和增強加速度
第8章 掌握內存管理
第9章 提示與技巧