手機(jī)游戲性能優(yōu)化之路
伴隨著手機(jī)硬件性能的不斷提升,移動(dòng)游戲的畫面渲染、物理模擬等各個(gè)環(huán)節(jié)都有了長(zhǎng)足進(jìn)步。即便是最頂尖的旗艦手機(jī),在運(yùn)行某些大型3D游戲時(shí),也難免會(huì)出現(xiàn)卡頓、發(fā)熱等問題,影響游戲體驗(yàn)。這就需要游戲開發(fā)者在底層引擎層面進(jìn)行深度優(yōu)化,以確保游戲在有限的硬件資源下保持流暢運(yùn)行。
架構(gòu)優(yōu)化:ECS與多線程
對(duì)于復(fù)雜的3D游戲來(lái)說(shuō),單線程的傳統(tǒng)架構(gòu)已經(jīng)很難滿足當(dāng)下的性能需求。我們必須突破這一瓶頸,充分利用現(xiàn)代CPU的多核并行能力。這就需要從根本上重構(gòu)游戲引擎的架構(gòu)。
Entity-Component-System(ECS架構(gòu)因其天生的數(shù)據(jù)導(dǎo)向特性而備受推崇。它將游戲?qū)ο蟛鸱譃閿?shù)據(jù)(Component和行為(System,使得游戲邏輯與數(shù)據(jù)存儲(chǔ)分離,大大提高了并行計(jì)算的可能性。我們將核心游戲系統(tǒng)用C++重寫,并采用ECS架構(gòu),這為后的多線程優(yōu)化奠定了基礎(chǔ)。
多線程并行是提升游戲性能的有力手段。我們采用了類似Skynet的ltask作為多線程框架,將游戲業(yè)務(wù)拆分到多個(gè)線程中并行處理。UI、粒子系統(tǒng)、IO等模塊都被分配到獨(dú)立的工作線程,只通過少量的消息通訊進(jìn)行協(xié)作。渲染底層的bgfx也是按多線程渲染設(shè)計(jì)的。這種并行架構(gòu)使得總工作量并未增加,但由于任務(wù)分散到多個(gè)CPU核心,每幀的耗時(shí)大幅降低。
通過xcode的調(diào)試信息可以看到,在游戲場(chǎng)景豐富時(shí),CPU占用率約為280%。如果采用單線程架構(gòu),要在不刪減特性的前提下實(shí)現(xiàn)流暢幾乎是不可能的任務(wù)。而在多線程架構(gòu)下,我們成功將游戲鎖定在30fps,每幀耗時(shí)控制在10ms左右,理論上甚至可以支持60fps。
減少CPU開銷
盡管多線程架構(gòu)已經(jīng)極大改善了游戲性能,但我們并不能止步于此。在手機(jī)平臺(tái),能耗是另一個(gè)不容忽視的問題。過高的CPU功耗不僅會(huì)加速電池電量的消耗,更重要的是會(huì)導(dǎo)致手機(jī)發(fā)熱,引發(fā)CPU自動(dòng)降頻,進(jìn)而影響幀率表現(xiàn)。
我們的目標(biāo)變成了在保證一定幀率水平的前提下,盡可能減少CPU開銷,從而降低能耗、延長(zhǎng)航時(shí)間、改善散熱效果。這比在PC平臺(tái)上的優(yōu)化要求更加嚴(yán)格和全面。
減少CPU開銷的技巧有很多,比如盡量避免重復(fù)計(jì)算、減少對(duì)象創(chuàng)建和獲取組件的頻率、間隔更新UI等。我們還對(duì)一些核心系統(tǒng)進(jìn)行了細(xì)致的和優(yōu)化,比如場(chǎng)景樹更新系統(tǒng)。盡管代碼量不大,但由Lua重寫為C++后,耗時(shí)已可以忽略不計(jì)。
我們還對(duì)一些常用數(shù)據(jù)進(jìn)行了緩存,避免每次創(chuàng)建對(duì)象時(shí)都從配置表中讀取。對(duì)于不需要實(shí)時(shí)更新的數(shù)據(jù),更是直接存儲(chǔ)在對(duì)象內(nèi)存中,減少運(yùn)行時(shí)的查詢開銷。
渲染管線優(yōu)化
渲染是手機(jī)游戲中最耗能的一個(gè)環(huán)節(jié),因此我們也在這一塊做了大量?jī)?yōu)化工作。在著色器層面,我們對(duì)常用的光照、陰影等shader進(jìn)行了精簡(jiǎn),盡可能減少無(wú)關(guān)的計(jì)算過程,提高執(zhí)行效率。
另一個(gè)值得一提的優(yōu)化是2D殘影特效。殘影作為一種常見的視覺特效,其原理是在每一幀都保留上一幀的畫面,并對(duì)其進(jìn)行混合和渲染。這種做法雖然簡(jiǎn)單直觀,但當(dāng)殘影數(shù)量較多時(shí),就會(huì)給GPU帶來(lái)沉重的負(fù)擔(dān)。
我們的優(yōu)化思路是預(yù)渲染殘影紋理,并在GPU中執(zhí)行殘影的混合和渲染過程。這不僅減輕了CPU的負(fù)擔(dān),更重要的是充分利用了GPU的并行計(jì)算能力,使得殘影的渲染過程變得高效流暢。
除此之外,我們還對(duì)遮擋剔除、光照烘焙等傳統(tǒng)的圖形學(xué)優(yōu)化手段進(jìn)行了實(shí)踐,以確保游戲在有限的移動(dòng)GPU上也能獲得理想的畫面表現(xiàn)。
能耗優(yōu)化
能耗優(yōu)化是我們優(yōu)化工作的最終目標(biāo)。一方面,我們希望延長(zhǎng)手機(jī)的航時(shí)間,讓玩家能夠長(zhǎng)時(shí)間沉浸在游戲中而無(wú)需頻繁充電。另一方面,控制好能耗也意味著手機(jī)發(fā)熱量降低,CPU可以保持在較高的主頻運(yùn)行,從而確保游戲的流暢性。
在能耗優(yōu)化方面,我們采取了多管齊下的策略。對(duì)游戲引擎的整體架構(gòu)進(jìn)行了優(yōu)化,使其在滿足一定幀率要求的CPU和GPU的負(fù)載都降到了最低水平。
我們對(duì)游戲中的各種特效和粒子系統(tǒng)進(jìn)行了精簡(jiǎn),只保留對(duì)游戲體驗(yàn)有重要影響的部分。這些視覺效果往往是能耗的大戶,適當(dāng)精簡(jiǎn)不僅能降低能耗,也有利于提升幀率表現(xiàn)。
我們還針對(duì)手機(jī)的硬件特性做了一些定制化的優(yōu)化。例如,對(duì)于支持ARM大小核的手機(jī),我們會(huì)將一些計(jì)算密集型的任務(wù)分配到大核心上執(zhí)行,以獲得更高的能效比。我們也會(huì)根據(jù)手機(jī)的散熱性能動(dòng)態(tài)調(diào)整游戲的畫質(zhì)設(shè)置,以避免手機(jī)過熱而影響體驗(yàn)。
經(jīng)過這一系列的優(yōu)化,我們最終實(shí)現(xiàn)了在手機(jī)平臺(tái)上,游戲的能耗控制在了合理的水平。玩家可以在更長(zhǎng)的時(shí)間內(nèi)沉浸在流暢的游戲體驗(yàn)中,而無(wú)需過多擔(dān)心電池電量和發(fā)熱問題。
游戲性能優(yōu)化是一個(gè)系統(tǒng)工程,需要從架構(gòu)、算法、渲染等多個(gè)層面入手,并根據(jù)手機(jī)平臺(tái)的特點(diǎn)進(jìn)行定制化的優(yōu)化。我們采用了ECS架構(gòu)和多線程并行,極大提升了游戲的整體性能表現(xiàn)。我們也在減少CPU開銷、優(yōu)化渲染管線、控制能耗等方面下了足夠的功夫,最終實(shí)現(xiàn)了在手機(jī)平臺(tái)上獲得流暢、高效、長(zhǎng)航的游戲體驗(yàn)。
