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