說起游戲的優(yōu)化,在游戲開發(fā)中經(jīng)常分為這幾步:
1. 首先要確定游戲中經(jīng)常會出現(xiàn)哪些問題 - Profile
2. 然后確定在哪些方向進行性能優(yōu)化 - Analyze
3 .最后再盡可能將問題逐個解決 - Solve
游戲開發(fā)中一定是先做工具,進行Profile,再進行優(yōu)化,所以,說優(yōu)化就不得不再扯一下Profile
常見的工具有一些是引擎和IDE自帶的,比如Unity自帶的Profiler,就包含了CPU,GPU,Memory等等各式各樣的性能分析工具,其他的比如GPA,Xcode Instrument和Visual Studio,Intel自帶的內(nèi)存管理工具在必要的時候也使需要去學習和使用的。
另外一些工具,就需要根據(jù)游戲的需求去編寫了,比如一鍵關(guān)閉所有特效,一鍵更改分辨率等等,一鍵設(shè)置場上NPC數(shù)量,簡單的游戲如啪啪三國是做成快捷鍵開啟Profile功能的,更為復雜的游戲如神秘海域則是通過游戲內(nèi)控制臺來進行更為細致的Profie。
接著,我們再來說說游戲優(yōu)化中主要的四個考慮方向:
CPU
引發(fā)的問題:
? 由于短時間內(nèi)的計算量太大,導致畫面流暢性降低,俗稱跳幀
? 發(fā)熱嚴重,耗電量高
常見的優(yōu)化手段:
? 將計算分到多個邏輯幀中進行計算,避免短時間內(nèi)的性能超過負荷,俗稱“分幀”(time-slice)。
? 將可以緩存的數(shù)據(jù)盡可能的緩存起來,避免重復計算和重復分配內(nèi)存,常見的示例為“內(nèi)存池”。
? 使用合理的算法和數(shù)據(jù)結(jié)構(gòu),比如:冒泡排序和直接插入排序在整體數(shù)組比較有序的情況下效率大大好于快速排序。把快排替換成是優(yōu)化程序排序效率的一個常見的思路。
GPU
引發(fā)的問題:
? 發(fā)熱嚴重,耗電量高
? FPS降低
常見的優(yōu)化手段:
? 優(yōu)化美術(shù)資源,比如合理規(guī)劃圖集,約定好模型的最大三角形面數(shù),制定合理的粒子效果規(guī)范。這個可以說是游戲優(yōu)化中最重要的一個,因此,技術(shù)美術(shù)在游戲開發(fā)中作用巨大。
? 簡化或者優(yōu)化著色器(shader),如在游戲開始前就對Shader進行編譯和加載。
? 使用Batching,盡量減少DrawCall
? 使用平臺推薦的壓縮格式,比如安卓平臺的ETC1和IOS平臺的PVRTC
引發(fā)的問題:
? 網(wǎng)絡(luò)延遲甚至掉線
? 加載資源導致的跳幀
? 加載時間過長
常見的優(yōu)化手段:
? 使用獨立的線程進行加載,有些引擎如Unity中還能利用協(xié)程
? 減少網(wǎng)絡(luò)包里面的冗余數(shù)據(jù)
? 合并小包,減少請求數(shù)據(jù)的次數(shù)
? 分幀對回包進行處理
? 限制一定時間內(nèi)的發(fā)包頻率
內(nèi)存
引發(fā)的問題:
? 閃退和卡死,比如安卓的Low Memory Killer會在低內(nèi)存情況下殺掉內(nèi)存占用過大的程序。
常見的優(yōu)化手段
? 動態(tài)加載和卸載資源,比如在游戲內(nèi)的時候,我們可以把游戲外的一些UI圖集卸載掉。
? 降低資源質(zhì)量或屏幕分辨率,這是有損優(yōu)化,一般作為最后的手段
總結(jié)
其實這四個方面的優(yōu)化總是相互制衡的,你把一個方面的優(yōu)化做好了,另一個方面的問題又會出現(xiàn)了,比如,我們?nèi)绻褂脛討B(tài)加載和卸載資源,這就雖然減少了內(nèi)存占用量,會在IO上造成加載時間延長的問題。
所以,我們在做游戲優(yōu)化的時候,不能太追求完美,剛剛好就是真的好(Good Enough Is Fine)。最終使得以上這四個方面能達到均衡即可,切忌在某一方面優(yōu)化過頭,又引發(fā)其他方面的問題,此消彼長的情況下,有時反而不如不做優(yōu)化。
評論
查看更多