Q:目前項(xiàng)目的發(fā)熱問(wèn)題很頭疼,2D游戲,基于TileMap、SpriteRenderer和UGUI的渲染,關(guān)閉了垂直同步,TargetFrameRate設(shè)置為60。Android和iOS上發(fā)熱都很?chē)?yán)重,而且在比較好的機(jī)型(比如iPhone 12這種),發(fā)熱現(xiàn)象甚至更明顯。
跟大部分情況不同,發(fā)熱并沒(méi)有怎么影響幀率,在大部分機(jī)型上,幀率都不是問(wèn)題,連iPhone 8機(jī)型,都能60幀跑滿(mǎn)。
在Unity Profile和Xcode都進(jìn)行過(guò)性能分析,CPU最明顯的熱點(diǎn)函數(shù)就是Spine的骨骼動(dòng)畫(huà)更新計(jì)算。然而到一個(gè)沒(méi)有骨骼動(dòng)畫(huà)的場(chǎng)景,發(fā)熱現(xiàn)象稍好點(diǎn),但還是比預(yù)期的要燙不少(場(chǎng)景中除了地面和一些靜態(tài)貼圖,基本就沒(méi)有多少東西)。
另一個(gè)比較普遍的發(fā)熱點(diǎn)是網(wǎng)絡(luò)測(cè)試,在某場(chǎng)景關(guān)閉網(wǎng)絡(luò)后,發(fā)熱依然嚴(yán)重。甚至啟動(dòng)游戲,停留在登錄界面一會(huì)兒,發(fā)熱現(xiàn)象都比別的游戲更明顯。
猜測(cè)是否由于每幀的頂點(diǎn)數(shù)量過(guò)多造成的,在游戲中Unity的Status面板,頂點(diǎn)數(shù)量Verts達(dá)到了40KB,三角形Tris也有幾乎20KB??雌饋?lái)很多,但我不太清楚當(dāng)前主流游戲這個(gè)數(shù)值的級(jí)別大概是多少。而且,頂點(diǎn)和三角形的數(shù)量很難解釋登錄界面依然容易發(fā)熱,畢竟登錄界面這些數(shù)值不可能很高。
自己也做了很多測(cè)試了,實(shí)在搞不清楚問(wèn)題究竟在哪兒,Unity是還有什么特別需要優(yōu)化的,針對(duì)發(fā)熱的點(diǎn)嗎?
A1:可以用Xcode抓幀看看帶寬,Load Store Action是否合理。
A2:以下是我的建議:
iPhone 8上跑滿(mǎn)60幀,證明CPU、GPU都沒(méi)有到達(dá)瓶頸,消耗在較為合理的范圍。推薦在Unity Profiler看一下CPU端的消耗,以及查看一下DrawCall數(shù)量。
推薦使用FrameDebugger,看一下是否有冗余的物體或者后處理在渲染,尤其是你說(shuō)的啟動(dòng)界面有發(fā)熱。
如果低級(jí)錯(cuò)誤都排查過(guò)了,那么建議看一下是否用了原生的插件。
渲染的分辨率是否調(diào)整過(guò)了,RenderScale的值和FrameDebugger可以查出來(lái)分辨率。
A3:關(guān)于發(fā)熱的問(wèn)題,通常要從幾個(gè)角度排查:CPU壓力(耗時(shí))、GPU壓力(耗時(shí)和帶寬,可以考慮降低分辨率看看發(fā)熱問(wèn)題是否會(huì)有改善)和IO等幾個(gè)角度。從題主的問(wèn)題上看,耗時(shí)應(yīng)該是沒(méi)問(wèn)題,都能跑滿(mǎn)幀(當(dāng)然60幀本身就是對(duì)發(fā)熱影響比較大的一點(diǎn),可以看看限制30幀會(huì)不會(huì)發(fā)熱有下降),所以要看看一些隱形的東西是否有問(wèn)題。比如帶寬,可以用Snapdragon在高通手機(jī)上跑一跑。如果帶寬較高,看看紋理的一些設(shè)置是否合理,比如是否壓縮、是否開(kāi)啟Mipmap,這兩項(xiàng)通常都是需要設(shè)置成開(kāi)啟的。還可以查看是否有不必要的BlitCopy操作,在URP項(xiàng)目中比較容易出現(xiàn)Copy Color和Copy Depth浪費(fèi)。對(duì)于IO,需要看看是否存在子線程里面有頻繁IO的現(xiàn)象。
如果大家有更好的回答,歡迎大家前往社區(qū)交流:
https://answer.uwa4d.com/question/62910e1ab87a457351669b0c