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