TOP
從紙書中看見香港,指定港書滿888再折100
Unity遊戲優化(第3版)(簡體書)
滿額折

Unity遊戲優化(第3版)(簡體書)

商品資訊

人民幣定價:98 元
定價
:NT$ 588 元
優惠價
87512
海外經銷商無庫存,到貨日平均30天至45天
下單可得紅利積點 :15 點
商品簡介
作者簡介
名人推薦
目次

商品簡介

主要內容:使用Unity Profiler發現程序中的瓶頸並找到解決方法發現VR項目中關鍵的性能問題,並學習如何處理它們以易用的方式增強著色器,通過細微而有效的性能調整優化它們使用物理引擎使場景盡可能動態化組織、過濾和壓縮藝術資源,在保持高質量的同時實現性能化使用Mono框架和C#實現內存利用化,以及優化GC

作者簡介

Aversa博士擁有義大利羅馬大學(University of Rome La Sapienza)的人工智能博士學位以及人工智能和機器人碩士學位。他對用於開發交互式虛擬代理和程序內容生成的人工智能有著濃厚的興趣。他曾擔任電子遊戲相關會議的程序委員會成員,如IEEE計算智能和遊戲會議,也經常參加game-jam比賽。他還經常撰寫有關遊戲設計和遊戲開發的博客。

我要感謝家人在這一年裡給我提供了穩定的生活;感謝Twitter上的Unity開發者幫助我澄清了Unity內部模糊的元素;還要感謝Keagan和Packt Publishing的其他編輯幫助我完成這項工作,並對我延遲交稿表示理解。

Chris Dickinson在英格蘭一個安靜的小鎮長大,對數學、科學,尤其是電子遊戲滿懷熱情。他喜歡玩遊戲並剖析遊戲的玩法,並試圖確定它們是如何工作的。在看了爸爸破解一個PC遊戲的十六進制代碼來規避早期的版權保護後,他完全震驚了,他對科學的熱情在當時達到了。Chris獲得電子物理學的碩士學位後,他飛到美國加州,在矽谷中心的科學研究領域工作。不久後,他不得不承認,研究工作並不適合他。在四處投簡歷之後,他找到了一份工作,終讓他走上了軟件工程的正確道路(據說,這對於物理學專業畢業生來說並不罕見)。
Chris是IPBX電話系統的自動化工具開發人員,他的性格更適合從事該工作。現在,他正在研究複雜的設備鏈,幫助開發人員修復和改進這些設備,並開發自己的工具。Chris學習了很多關於如何使用大型、複雜、實時、基於事件、用戶輸入驅動的狀態機方面的知識。在這方面,Chris基本上是自學成才的,他對電子遊戲的熱情再次高漲,促使他真正弄清楚了電子遊戲的創建方式。當他有足夠的信心時,他回到學校攻讀遊戲和模擬編程的學士學位。當他獲得學位時,已經可以用C 編寫自己的遊戲引擎(盡管還很初級),並在日常工作中經常使用這些技能。然而,由於想創建遊戲(應該只是創建遊戲,而不是編寫遊戲引擎),Chris選擇了他喜歡的公開發行的遊戲引擎——一個稱為Unity3D的優秀小工具,並開始製作一些遊戲。
經過一段時間的獨立開發遊戲,Chris遺憾地決定,這條特定的職業道路並不適合他,但他在短短幾年內積累的知識,以大多數人的標準來看,令人印象深刻,他喜歡利用這些知識幫助其他開發人員創建作品。從那以後,Chris編寫了一本關於遊戲物理的教程(Learning Game Physics with Bullet Physics and OpenGL,Packt Publishing)和兩本關於Unity性能優化的書籍。他娶了他一生的摯愛Jamie,並在加州聖馬特奧市的Jaunt公司(這是一家專注於提供VR和AR體驗(如360視頻)的虛擬現實/增強現實初創公司)工作,研究酷的現代技術,擔任測試領域的軟件開發工程師(SDET)。
工作之余,Chris一直苦惱於對棋盤遊戲的沉迷(特別是《太空堡壘:卡拉狄加與血腥狂怒》),他癡迷於暴雪的《守望先鋒》和《星際爭霸2》,專注於Unity版本,經常在紙上勾畫關於遊戲的構思。不久的將來,當時機成熟的時候(當他不再懈怠時),相信他的計劃就會實現。

名人推薦

Unity引擎提供的一系列卓越功能可以幫助開發 者構建高性能的遊戲。本書引導讀者優化遊戲開發中的方方面面,從遊戲角色到腳本,一直到動畫優化。
在本書中,讀者將學習提高遊戲腳本質量的代碼編寫技術,學習如何使用E C S和Burs t編譯器等Unity技術優化遊戲。本書將助力讀者使用Unity生態系統管理第三方工具,引導讀者解決Unity大型遊戲和V R遊戲中的性能問題,幫助讀者檢測性能問題並分析性能根源。隨著閱讀的深入,讀者將學習Unity C#腳本代碼的實踐並掌握使用模式,之後會掌握優化音頻資源和紋理文件,以及高效地存儲和使用資源文件。然後,讀者將了解渲染管線並學習如何識別管線中的性能問題。此外,讀者還將學習如何優化內存以及Unity的處理器單元。後,讀者將獲得Unity專家用於提升項目工作流的提示和技巧。
閱讀本書,讀者將提升使用Unity及其組件構建交互式遊戲所需的技能。

前 言

用戶體驗在所有遊戲中都是重要的組成部分,它不僅包括遊戲的劇情和玩法,也包括運行時畫面的流暢性、與多人服務器連接的可靠性、用戶輸入的響應性,甚至由於移動設備和云下載的流行,它還包括終程序文件的大小。由於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存儲庫上也會有更新。

約定

代碼塊的格式設置如下:

void DoSomethingCompletelyStupid() {

Profiler.BeginSample("My Profiler Sample");

List listOfInts = new List();

for(int i = 0; i < 1000000; i) {

listOfInts.Add(i);

}

Profiler.EndSample();

}

注意:警告或重要提示出現在此處。

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

讀者反饋

歡迎讀者提供反饋。

如果你對本書的任何內容有問題,請在電子郵件的主題中提到本書的標題,並發送電子郵件到bookservice@263.net。

目次

第Ⅰ部分 基本的腳本優化

第1章 研究性能問題 2

1.1 使用Unity Profiler收集分析數據 3

1.1.1 啟動Profiler 4

1.1.2 Profiler窗口 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.5 Update、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.1 Draw Call 79

3.2 材質和著色器 81

3.3 Frame Debugger 83

3.4 動態批處理 85

3.4.1 頂點屬性 86

3.4.2 網格縮放 87

3.4.3 動態批處理總結 88

3.5 靜態批處理 89

3.5.1 Static標記 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.4 Asset Bundle和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.6 Rigidbody激活和休眠狀態 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.1 GPU前端 145

6.1.2 GPU後端 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 啟用/禁用GPU Skinning 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 優化Unity UI 163

6.3.9 著色器優化 167

6.3.10 使用更少的紋理數據 173

6.3.11 測試不同的GPU紋理壓縮格式 174

6.3.12 小化紋理交換 174

6.3.13 VRAM限制 175

6.3.14 照明優化 176

6.3.15 優化移動設備的渲染

性能 178

6.4 本章小結 180

第Ⅲ部分 高級優化

第7章 虛擬現實和增強現實的優化 182

7.1 XR技術概述 182

7.2 XR開發 183

7.3 XR中的性能增強 187

7.3.1 物盡其用 187

7.3.2 單通道立體渲染和多通道立體渲染 188

7.3.3 應用抗鋸齒 190

7.3.4 前向渲染 190

7.3.5 VR的圖像效果 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.1 Mono平臺 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.7 Unity API中的數組 219

8.4.8 對字典鍵使用

InstanceID 220

8.4.9 foreach循環 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.16 IL2CPP優化 239

8.4.17 WebGL優化 239

8.5 本章小結 239

第9章 面向數據的技術棧 240

9.1 多線程的問題 241

9.2 Unity的作業系統 244

9.2.1 一個基本的作業 245

9.2.2 一個較複雜的示例 247

9.3 新的ECS 251

9.4 Burst編譯器 258

9.5 本章小結 259

第10章 使用GPU Instancing 優化大量動畫物件 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.5 C#代碼詳解 281

10.6 第二個版本——優化 282

10.6.1 AnimationInfo 283

10.6.2 GPUInstancing

Animation 283

10.6.3 AnimatorBakeInfo 283

10.6.4 AnimationBaker 284

10.7 本章小結 289

第11章 提示與技巧 290

11.1 編輯器熱鍵提示 291

11.1.1 GameObject 291

11.1.2 Scene窗口 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.3 Inspector 窗口 296

11.2.4 Project窗口 297

11.2.5 Hierarchy窗口 298

11.2.6 Scene和Game窗口 299

11.2.7 Play模式 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

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 512
海外經銷商無庫存,到貨日平均30天至45天

暢銷榜

客服中心

收藏

會員專區