3dwoo大學簡體電腦書店
Unity游戲優化(第3版)
( 簡體 字)
作者:[意]大衛·阿韋爾薩(Davide Aversa)、[英]克里斯·迪金森(Chris Dickinson)著類別:1. -> 多媒體 -> 遊戲引擎 -> Unity
譯者:蔡俊鴻 譯
出版社:清華大學出版社Unity游戲優化(第3版) 3dWoo書號: 56073
詢問書籍請說出此書號!
缺書
NT售價: 490
出版日:9/1/2022
頁數:305
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787302613282 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
第Ⅰ部分基本的腳本優化
第1章研究性能問題 2
1.1使用UnityProfiler收集分析數據 3
1.1.1啟動Profiler 4
1.1.2Profiler窗口 8
1.2性能分析的最佳方法 17
1.2.1驗證腳本是否存在 18
1.2.2驗證腳本次數 18
1.2.3驗證事件的順序 19
1.2.4最小化正在進行的代碼更改 20
1.2.5最小化內部影響 20
1.2.6最小化外部影響 22
1.2.7代碼片段的針對性
分析 22
1.3關于分析的思考 26
1.3.1理解Profiler工具 27
1.3.2減少干擾 27
1.3.3關注問題 28
1.4本章小結 28
第2章腳本策略 29
2.1使用最快的方法獲取組件 30
2.2移除空的回調定義 31
2.3緩存組件引用 34
2.4共享計算輸出 35
2.5Update、Coroutines和InvokeRepeating 36
2.6更快的GameObject空引用檢查 39
2.7避免從GameObject中檢索字符串屬性 40
2.8使用合適的數據結構 42
2.9避免在運行時修改
Transform的父節點 43
2.10關注緩存Transform的變化 44
2.11避免在運行時使用Find()和SendMessage()方法 45
2.11.1將引用分配給預先
存在的對象 48
2.11.2靜態類 50
2.11.3單例組件 52
2.11.4全局消息傳遞系統 56
2.12禁用未使用的腳本和對象 66
2.12.1通過可見性禁用對象 66
2.12.2通過距離禁用對象 67
2.13使用距離的平方而不是距離 68
2.14最小化反序列化行為 69
2.14.1減小序列化對象 70
2.14.2異步加載序列化對象 70
2.14.3在內存中保存之前加載的序列化對象 70
2.14.4將公共數據移入ScriptableObject 71
2.15疊加、異步地加載
場景 71
2.16創建自定義的
Update()層 72
2.17本章小結 76
第Ⅱ部分圖形優化
第3章批處理的優勢 78
3.1DrawCall 79
3.2材質和著色器 81
3.3FrameDebugger 83
3.4動態批處理 85
3.4.1頂點屬性 86
3.4.2網格縮放 87
3.4.3動態批處理總結 88
3.5靜態批處理 89
3.5.1Static標記 89
3.5.2內存需求 90
3.5.3材質引用 90
3.5.4靜態批處理的警告 90
3.5.5靜態批處理總結 91
3.6本章小結 92
第4章優化藝術資源 93
4.1音頻文件 93
4.1.1導入音頻文件 94
4.1.2加載音頻文件 94
4.1.3編碼格式與品質級別 97
4.1.4音頻性能增強 98
4.2紋理文件 101
4.2.1紋理壓縮格式 101
4.2.2紋理性能增強 103
4.3網格和動畫文件 111
4.3.1減少多邊形數量 112
4.3.2調整網格壓縮 112
4.3.3恰當使用Read-Write
Enabled 112
4.3.4考慮烘焙動畫 113
4.3.5合并網格 113
4.4AssetBundle和Resource 114
4.5本章小結 115
第5章加速物理引擎 116
5.1物理引擎的內部工作情況 117
5.1.1物理和時間 117
5.1.2靜態碰撞器和動態碰撞器 120
5.1.3碰撞檢測 121
5.1.4碰撞器類型 122
5.1.5碰撞矩陣 124
5.1.6Rigidbody激活和休眠狀態 124
5.1.7射線和對象投射 125
5.1.8調試物理 125
5.2物理性能優化 127
5.2.1場景設置 127
5.2.2適當使用靜態碰撞器 129
5.2.3恰當使用觸發體積 129
5.2.4優化碰撞矩陣 130
5.2.5首選離散碰撞檢測 131
5.2.6修改固定更新頻率 132
5.2.7調整允許的最大時間步長 133
5.2.8最小化射線投射和邊界體積檢查 133
5.2.9避免復雜的網格碰撞器 135
5.2.10避免復雜的物理組件 137
5.2.11使物理對象休眠 137
5.2.12修改處理器迭代次數 138
5.2.13優化布娃娃 139
5.2.14確定何時使用物理 141
5.3本章小結 142
第6章動態圖形 143
6.1管線渲染 144
6.1.1GPU前端 145
6.1.2GPU后端 146
6.1.3光照和陰影 149
6.1.4多線程渲染 152
6.1.5低級渲染API 153
6.2性能檢測問題 153
6.2.1分析渲染問題 153
6.2.2暴力測試 155
6.3渲染性能的增強 157
6.3.1啟用/禁用GPUSkinning 157
6.3.2降低幾何復雜度 157
6.3.3減少曲面細分 157
6.3.4應用GPU實例化 158
6.3.5使用基于網格的LOD 159
6.3.6使用遮擋剔除 160
6.3.7優化粒子系統 161
6.3.8優化UnityUI 163
6.3.9著色器優化 167
6.3.10使用更少的紋理數據 173
6.3.11測試不同的GPU紋理壓縮格式 174
6.3.12最小化紋理交換 174
6.3.13VRAM限制 175
6.3.14照明優化 176
6.3.15優化移動設備的渲染
性能 178
6.4本章小結 180
第Ⅲ部分高級優化
第7章虛擬現實和增強現實的優化 182
7.1XR技術概述 182
7.2XR開發 183
7.3XR中的性能增強 187
7.3.1物盡其用 187
7.3.2單通道立體渲染和多通道立體渲染 188
7.3.3應用抗鋸齒 190
7.3.4首選前向渲染 190
7.3.5VR的圖像效果 190
7.3.6背面剔除 191
7.3.7空間化音頻 191
7.3.8避免攝像機物理
碰撞 191
7.3.9避免歐拉角 192
7.3.10運動約束 192
7.3.11跟上最新發展 192
7.4本章小結 193
第8章掌握內存管理 194
8.1Mono平臺 195
8.1.1內存域 196
8.1.2.垃圾回收 198
8.2代碼編譯 201
8.2代碼編譯 201
8.3分析內存 204
8.3.1分析內存消耗 204
8.3.2分析內存效率 205
8.4內存管理性能增強 205
8.4.1垃圾回收策略 205
8.4.2手動JIT編譯 206
8.4.3值類型和引用類型 207
8.4.4字符串連接 214
8.4.5裝箱 217
8.4.6數據布局的重要性 218
8.4.7UnityAPI中的數組 219
8.4.8對字典鍵使用
InstanceID 220
8.4.9foreach循環 221
8.4.10協程 221
8.4.11閉包 221
8.4.12.NET庫函數 222
8.4.13臨時工作緩沖區 222
8.4.14對象池 223
8.4.15預制池 225
8.4.16IL2CPP優化 239
8.4.17WebGL優化 239
8.5本章小結 239
第9章面向數據的技術棧 240
9.1多線程的問題 241
9.2Unity的作業系統 244
9.2.1一個基本的作業 245
9.2.2一個較復雜的示例 247
9.3新的ECS 251
9.4Burst編譯器 258
9.5本章小結 259
第10章使用GPUInstancing優化大量動畫對象 260
10.1應用場景 260
10.2實現思路 261
10.3主要實現步驟 261
10.4部分核心邏輯偽代碼 261
10.5第一個版本——實現 262
10.5.1運行 262
10.5.2項目概覽 265
10.5.3編輯器烘焙代碼詳解 265
10.5.4運行時代碼和Shader詳解 274
10.5.5C#代碼詳解 281
10.6第二個版本——優化 282
10.6.1AnimationInfo 283
10.6.2GPUInstancing
Animation 283
10.6.3AnimatorBakeInfo 283
10.6.4AnimationBaker 284
10.7本章小結 289
第11章提示與技巧 290
11.1編輯器熱鍵提示 291
11.1.1GameObject 291
11.1.2Scene窗口 291
11.1.3數組 292
11.1.4界面 293
11.1.5在編輯器內撰寫文檔 294
11.2編輯器界面提示 294
11.2.1腳本執行順序 294
11.2.2編輯器文件 294
11.2.3Inspector窗口 296
11.2.4Project窗口 297
11.2.5Hierarchy窗口 298
11.2.6Scene和Game窗口 299
11.2.7Play模式 299
11.3腳本提示 300
11.3.1一般情況 300
11.3.2特性 301
11.3.3日志 302
11.3.4有用的鏈接 302
11.4自定義編輯器腳本和菜單提示 302
11.5外部提示 303
11.6其他提示 304
11.7本章小結 305
使用Unity Profiler發現程序中的瓶頸并找到解決方法
發現VR項目中關鍵的性能問題,并學習如何處理它們
以易用的方式增強著色器,通過細微而有效的性能調整優化它們
使用物理引擎使場景盡可能動態化
組織、過濾和壓縮藝術資源,在保持高品質的同時實現性能**化
使用Mono框架和C#實現內存利用**化,以及優化GC
用戶體驗在所有游戲中都是重要的組成部分,它不僅包括游戲的劇情和玩法,也包括運行時畫面的流暢性、與多人服務器連接的可靠性、用戶輸入的響應性,甚至由于移動設備和云下載的流行,它還包括最終程序文件的大小。由于Unity等工具提供了大量有用的開發功能,還允許個人開發者訪問,因此游戲開發的門檻已大大降低。然而,由于游戲行業的競爭激烈,玩家對游戲最終品質的期望日益提高,因此就要求游戲的各方面應能經得起玩家和評論家的考驗。
性能優化的目標與用戶體驗密不可分。缺乏優化的游戲會導致低幀率、卡頓、崩潰、輸入延遲、過長的加載時間、不一致和令人不舒服的運行時行為、物理引擎的故障,甚至過高的電池消耗(移動設備通常被忽略的指標)。只要遭遇上述問題之一,就是游戲開發者的噩夢,因為即使其他方面都做得很好,評論也會只炮轟做得不好的一個方面。
性能優化的目標之一是最大化地利用可用資源,包括CPU資源,如消耗的CPU循環數、使用的主內存空間大小(稱為RAM),也包括GPU資源(GPU有自己的內存空間,稱為VRAM),如填充率、內存帶寬等。然而,性能優化最重要的目標是確保沒有資源會不合時宜地導致性能瓶頸,優先級最高的任務得到優先執行。哪怕很小的、間歇性的停頓或性能方面的延遲都會破壞玩家的體驗,打破沉浸感,限制開發人員嘗試創建體驗的潛力。另一個需要考慮的事項是,節省的資源越多,在游戲中創建的活動便越多,從而產生更有趣、更生動的玩法。
同樣重要的是,要決定何時后退一步,停止增強性能。在一個擁有無限時間和資源的世界里,總會有一種方法能讓游戲變得更出色、更快、更高效。在開發過程中,必須確定產品達到了可接受的質量水平。如果不這樣做,就會重復實現那些很少或沒有實際好處的變更,而每個變更都可能引入更多的bug。
判斷一個性能問題是否值得修復的最佳方法是回答一個問題:“用戶會注意到它嗎?”如果這個問題的答案是“不”,那么性能優化就是白費力氣。軟件開發中有句老話:
過早的優化是萬惡之源。
過早優化是指在沒有任何必要證據的情況下,為提高性能而重新編寫和重構代碼。這可能意味著在沒有顯示存在性能問題的情況下進行更改,或者進行更改的原因是,我們只相信性能問題可能源于某個特定的領域,但沒有證據證明的確存在該問題。
當然,Donald Knuth提出的這一常見說法的含義是,編寫代碼時應該避免更直接、更明顯的性能問題。然而,在項目末尾進行真正的性能優化將花費很多時間,而我們應該做好計劃,以正確地改善項目,同時避免在未進行驗證的情況下實施開銷更大和更耗時的變更。這些錯誤會使整個軟件開發團隊付出沉重的代價,為沒有成效的工作浪費時間是令人沮喪的。
本書介紹在Unity程序中檢測和修復性能問題所需的工具、知識和技能,不管這些問題源于何處。這些瓶頸可能出現在CPU、GPU和RAM等硬件組件中,也可能出現在物理、渲染和Unity引擎等軟件子系統中。
在每天充斥著高質量新游戲的市場中,優化游戲的性能將使游戲具有更大的成功率,從而增加在市場上脫穎而出的機會。
本書內容
本書適合想要學習優化技術,用新的Unity版本創建高性能游戲的游戲開發者。
第1章探索Unity Profiler,研究剖析程序、檢測性能瓶頸以及分析問題根源的一系列方法。
第2章學習Unity項目中C#腳本代碼的最佳實踐,最小化MonoBehaviour回調的開銷,改進對象間的通信等。
第3章探索Unity的動態批處理和靜態批處理系統,討論如何使用它們減輕渲染管線的負擔。
第4章介紹藝術資源的底層技術,學習如何通過導入、壓縮和編碼避免常見的陷阱。
第5章研究Unity內部用于3D和2D游戲的物理引擎的細微差別,以及如何正確地組織物理對象,以提升性能。
第6章深入探討渲染管線,如何改進在GPU或CPU上遭受渲染瓶頸的應用程序,如何優化光照、陰影、粒子特效等圖形效果,如何優化著色器代碼,以及一些用于移動設備的特定技術。
第7章關注VR和AR等娛樂媒介,還介紹了一些針對這些平臺構建的程序所獨有的性能優化技術。
第8章討論如何檢驗Unity引擎、Mono框架的內部工作情況,以及這些組件內部如何管理內存,以使程序遠離過高的堆分配和運行時的垃圾回收。
第9章研究了多線程密集型游戲的Unity優化——DOTS,介紹了新的C#作業系統、新的Unity ECS和Burst編譯器。
第10章講解了如何將Skinned MeshRenderer轉為MeshRenderer,同時啟用GPU Instancing優化大量動畫對象。本章由譯者根據本書內容所編寫,對Unity的較新技術做了補充。
第11章介紹Unity專家用于提升項目工作流和場景管理的大量有用技術。
閱讀本書的條件
本書主要關注Unity 2019和Unity 2020的特性和增強功能。書中討論的很多技術可應用到Unity 2018或更舊版本的項目中,但這些版本列出的特性可能會有所不同,這些差異會在適當的地方突出顯示。
值得注意的是,書中的代碼應該用于Unity 2020,但在撰寫本文時,只能在alpha版本上進行測試。額外的不兼容性可能會出現在Unity 2020的非alpha階段。
下載示例代碼文件
本書提供相關代碼、參考網站,以及本書中使用的屏幕截圖、圖表的彩色圖像,可以掃描本書封底的二維碼下載。
如果代碼有更新,在現有的GitHub存儲庫上也會有更新。
約定
代碼塊的格式設置
注意:警告或重要提示出現在此處。

提示:提示和技巧出現在此處。

讀者反饋
歡迎讀者提供反饋。
如果你對本書的任何內容有問題,請在電子郵件的主題中提到本書的標題,并發送電子郵件到。
pagetop