《球球大作战》游戏优化之路(下)
演講內(nèi)容
大家好,我叫徐宇峰,負(fù)責(zé)《球球大作戰(zhàn)》的性能優(yōu)化。
《球球大作戰(zhàn)》現(xiàn)在擁有五億多的玩家,為了吸引如此龐大的玩家群體,我們提供給玩家更炫更酷的皮膚,這些美輪美奐的皮膚,讓《球球大作戰(zhàn)》的游戲畫面更加絢麗多彩,但隨著皮膚日益精致,性能問題開始日益突出。
?
我們的皮膚正面看起來(lái)很簡(jiǎn)單,從側(cè)面看,皮膚由精美模型與很多特效層組合而成。
皮膚的材質(zhì)大部分為半透明。大量的半透明材質(zhì)無(wú)法合批渲染,導(dǎo)致單套皮膚Draw Calls達(dá)到82個(gè),面數(shù)1.1萬(wàn)以及骨骼40個(gè)。
?
《球球大作戰(zhàn)》最核心技能就是分身吃球,而當(dāng)玩家分身之后,Draw Calls更是暴漲,游戲中玩家最大16分身時(shí),Draw Calls有820多,面數(shù)達(dá)17.7萬(wàn)。
?
在實(shí)際游戲中,多玩家多皮膚分身后,Draw Calls經(jīng)常能輕松過(guò)千,下面視頻是我們內(nèi)部的極限測(cè)試版情況。
大家能看到,Draw Calls最低有400-500,最高達(dá)到2000多,如此高的Draw Calls導(dǎo)致游戲的幀率急劇下降,卡頓嚴(yán)重。而球球作為一款競(jìng)技游戲,性能與體驗(yàn)至關(guān)重要。
?
我們團(tuán)隊(duì)采用各種優(yōu)化方法:
?
- 模型貼圖合并:模型與貼圖盡可能的合并在一起,利用Unity的動(dòng)態(tài)合批渲染,減少Draw Calls。
- 減少半透明材質(zhì):半透明會(huì)帶來(lái)融合運(yùn)算,其次重疊的半透明物體無(wú)法合批渲染,導(dǎo)致Draw Calls增加。
- 減少粒子系統(tǒng):粒子會(huì)增加CPU運(yùn)算,還會(huì)增加Draw Calls,每套皮膚的粒子數(shù)量我們控制在40個(gè)以內(nèi).
- LOD系統(tǒng)
- 降低分辨率:皮膚的貼圖普遍采用512k,部分貼圖在低端機(jī)器上降低到256k。
?
我們來(lái)看看優(yōu)化對(duì)比。
下面視頻是一個(gè)LOD系統(tǒng)的效果對(duì)比,左邊是高性能機(jī)型高畫質(zhì),右邊是低端機(jī)型流暢畫質(zhì)。左右相互對(duì)比可以看到,右邊的皮膚少了些特效與動(dòng)畫,貼圖分辨率也相應(yīng)降低。
通過(guò)以上優(yōu)化,游戲性能大約提升52%,但畫面品質(zhì)同樣遭受損失,在中低端機(jī)器上尤為明顯,這點(diǎn)很容易引起玩家的不滿。
美術(shù)團(tuán)隊(duì)也希望所有機(jī)型,畫面盡可能的完美,并且過(guò)少Draw Calls極大限制了美術(shù)的高水平發(fā)揮。
?
《球球大作戰(zhàn)》優(yōu)化的難點(diǎn)是皮膚分身后Draw Calls暴漲的問題。
我們想到用RenderTexture來(lái)降低Draw Calls峰值,但皮膚有太多半透明,渲染管線中對(duì)于透明相關(guān)的處理是在管線后期進(jìn)行的。由于不同物體是按照順序渲染的,對(duì)透明的處理方式是混合,實(shí)際上就是shader輸出顏色與此像素位置已有顏色的合并過(guò)程。
下圖中的混合公式是Unity中最標(biāo)準(zhǔn)的混融模式Blend SrcAlpha OneMinusSrcAlpha。
?
假設(shè)將Camera背景的顏色設(shè)置為全黑色(0001)或全白色(1111),分別進(jìn)行渲染,渲染后的顏色分別為Cblack、Cwhite,得到公式1和2。公式中藍(lán)色為已知數(shù),紫色為未知數(shù),2個(gè)公式可以求出2個(gè)未知數(shù)。
具體代碼請(qǐng)參考:
下面看看具體制作流程。
?
我們把原資源用單相機(jī)渲染到RenderTexture,相機(jī)每幀切換黑白背景,形成連續(xù)序列幀,這是因?yàn)閱蝹€(gè)相機(jī)能節(jié)省更多的Draw Calls,但如果動(dòng)畫速度過(guò)快,就必須使用雙相機(jī)保證品質(zhì)。
RT經(jīng)過(guò)GPU做算法剔除,輸出到多張RenderTexture。RT我們采用512分辨率,一共40張,格式為ARGBHalf,真機(jī)占用內(nèi)存約為20兆,目前市面上主流手機(jī)內(nèi)存大部分為2G以上,所以內(nèi)存很充足。具體用到那種分辨率與RT數(shù)量的多少,需要根據(jù)不同機(jī)型做適當(dāng)調(diào)整。
?
多張帶RT的RenderTexture組成一套序列幀,利用Plane切換RT做成序列幀動(dòng)畫。序列幀會(huì)循環(huán)渲染,從RT1渲染到40,再回到第1張。
Plane讀取RT時(shí)也是循環(huán)讀取,最后序列幀動(dòng)畫放到場(chǎng)景中與半透明背景,半透明皮膚以及UI等進(jìn)行融合。
下面我們來(lái)看看原資源與RT資源的實(shí)時(shí)效果對(duì)比。這是原素材與RenderTexture的實(shí)時(shí)效果對(duì)比,原素材由十幾層特效疊加,而RenderTexture只有單個(gè)面。
大家看看不同資源的效果對(duì)比,新技術(shù)首先必須保證美術(shù)品質(zhì)才能投入使用。
?
在美術(shù)品質(zhì)保證后,再看看優(yōu)化前后Draw Calls對(duì)比。
當(dāng)分身不斷增加時(shí),Draw Calls以線性增長(zhǎng),大家可以看看下面的Draw Calls圖表,從最開始63暴漲至900多。
在RT模式下,分身的增加帶來(lái)Draw Calls的個(gè)位數(shù)增加,同時(shí)可以看到在RT模式下,因?yàn)槲覀兝枚鄰圧enderTexture,每個(gè)分身的動(dòng)畫幀是錯(cuò)開的,動(dòng)畫并不完全一樣。
?
1
我們?cè)倏纯凑鏅C(jī)數(shù)據(jù)對(duì)比,測(cè)試平臺(tái)為普通千元機(jī)。
如下圖所示,左圖分身數(shù)從1至16,普通模式Draw Calls從63暴漲至917,翻了14.5倍,每一次分身數(shù)量的翻倍都讓Draw Calls劇烈變化。而RT模式從64到83只增加19個(gè)。
有圖CPU消耗圖,在RT模式下,CPU的消耗非常平穩(wěn),而普通模式最大分身時(shí)消耗已經(jīng)翻倍。
?
再來(lái)看看FPS與內(nèi)存消耗。
如下圖所示,手機(jī)號(hào)碼幀率在普通模式下,16分身幀率已經(jīng)降低到25,加上UI與其它邏輯消耗,已經(jīng)產(chǎn)生游戲卡頓。而RT模式幀率非常平穩(wěn)。
內(nèi)存方面因?yàn)镽T用了40張16位的512貼圖,內(nèi)存大約多20MB,這是RT模式唯一消耗點(diǎn)。實(shí)際應(yīng)用中我們會(huì)根據(jù)機(jī)器的內(nèi)存容量,控制RT的數(shù)量與分辨率。
《球球大作戰(zhàn)》同屏有上千物體,每幀數(shù)千個(gè)物體的位置、大小、動(dòng)畫、網(wǎng)絡(luò)數(shù)據(jù)等伴隨著產(chǎn)生大量邏輯運(yùn)算。
主要邏輯有:
?
- 利用插值函數(shù)使物體的移動(dòng)更加平滑。
- 玩家吃球后重量會(huì)增加:根據(jù)重量來(lái)計(jì)算球的尺寸與前后位置,尺寸越大物體越靠近攝像機(jī)。
- AI狀態(tài)機(jī):玩家根據(jù)游戲狀態(tài),如二個(gè)玩家距離接近時(shí),會(huì)播放調(diào)侃動(dòng)畫,吃掉其他玩家時(shí)播放炫耀動(dòng)畫;
- 相機(jī)視野計(jì)算:玩家所有球的數(shù)量與尺寸變化,都伴隨著相機(jī)位置與FOV調(diào)整,每個(gè)分身必須在相機(jī)視野內(nèi),最大分身盡可能處于屏幕中心;
- 其它邏輯:還有網(wǎng)絡(luò)數(shù)據(jù)解壓縮、解密、背景迷霧、UI運(yùn)算等。
以上這么多的實(shí)時(shí)運(yùn)算量會(huì)對(duì)CPU產(chǎn)生巨大壓力。
?
我們利用Unity 2018的ECS系統(tǒng),把所有邏輯做分類,純邏輯運(yùn)算做成PureECS,其他部分做成HybridECS。數(shù)千物體的邏輯運(yùn)算,盡可能分配到多個(gè)核心。
這極大的提升游戲性能,并且更快更復(fù)雜的運(yùn)算讓物體的移動(dòng)、旋轉(zhuǎn)更加平滑和細(xì)膩,增強(qiáng)游戲的用戶體驗(yàn)。
?
上述的優(yōu)化方法,部分處于《球球大作戰(zhàn)》的試用階段,我們一直都在不斷嘗試和創(chuàng)新,使用各種優(yōu)化方式,讓《球球大作戰(zhàn)》擁有更好的用戶體驗(yàn),并不斷煥發(fā)新的活力!
我的演講到此結(jié)束,謝謝大家。
總結(jié)
以上是生活随笔為你收集整理的《球球大作战》游戏优化之路(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《球球大作战》游戏优化之路(上)
- 下一篇: 用Unity盖房子(一):《勇者斗恶龙: