Unity手機游戲發(fā)熱發(fā)燙優(yōu)化指南與技巧
Unity手機游戲發(fā)熱發(fā)燙優(yōu)化指南與技巧
?
很多小伙伴做完游戲后,發(fā)布到Android,運行,游戲很流暢,也不卡頓,但是跑一會游戲,手機就發(fā)熱,發(fā)燙。客戶提出需求,能否讓它不發(fā)燙? 本文從以下3方面來分析手機發(fā)燙的問題,給大家提供一個解決此類問題的通用思路:
(1) 手機發(fā)燙是如何引起的?為什么要解決發(fā)燙問題?
(2) 如何定位手機發(fā)燙的問題?
(3) 針對性常用優(yōu)化手段與策略?

1手機發(fā)燙是如何引起的?為什么要解決發(fā)燙問題?
?
手機可以理解為是一臺小型的電腦, 里面運行了很多app。CPU處理完數據和事件后,如果沒有任務要處理了,就會休眠下去, CPU占用率也就會下降。休眠下去了,CPU不工作或工作在低功耗模式下了,消耗的電流就沒有那么大了。手機電路也會有電阻,電阻+電流就會轉化為熱能(熱能=I*R^2),熱能會通過手機的散熱導熱系統(tǒng)從外殼散去。長時間CPU的工作,就會導致長時間的高負荷電流,從而導致產生大量的熱能,如果熱能的產生速率大于熱能散發(fā)的速率,手機表面溫度就會升高,也就是我們說的發(fā)燙。
?
接下來說一個”低溫燙傷”的概念,長時間握住一個高于人體體溫的低熱物體,會容易形成低溫燙傷。一般低溫燙傷容易發(fā)生的溫度在42~51度?;旧?0,42左右就是一個臨界點,最好我們的長時間游戲的手機溫度要低于42。如果玩家長時間握住一個發(fā)燙的手機玩游戲,有可能導致玩家低溫燙傷,玩家可以通過法律手段來告游戲公司索取賠償。所以游戲公司要解決長時間游戲手機發(fā)燙的問題,避免玩家出現低溫燙傷。
?
“手機發(fā)燙”的本質是CPU”很努力不休息”的工作才能保證游戲app的流暢運行,達到額定的幀率。而這個過程中產生熱量的速度大于散去熱量的速度。所以手機發(fā)燙的本質還是CPU處理的事情較多,本質還是要提升程序的性能,讓程序能更快的完成從而讓CPU有機會休眠或低功耗運行,從而讓手機不發(fā)燙,所以解決手機發(fā)燙的本質問題還是優(yōu)化提升手機游戲app的代碼性能。

2 如何定位手機發(fā)燙的問題
?
經過上面的分析,雖然游戲不卡,但是CPU長時間滿負荷的工作導致手機發(fā)燙,問題本質還是性能優(yōu)化問題。所以本質還是性能優(yōu)化的問題。定位手機發(fā)燙問題和定位性能問題大體思路與處理方式一樣的。接下來我給大家分析幾個常用的定位問題的方式和方法。
(1) 真機運行游戲進程,查看游戲進程的CPU占用率。當遇到手機發(fā)燙的問題,我們一定要先看以下真機的CPU占用率,一般CPU總占用率肯定超過>80%以上才會有明顯的手機發(fā)燙現象。如果手機的總CPU占用率>80%, 而游戲進程的CPU占用率比較低,其它別的進程的CPU占用率比較高,可以具體分析以下,可能是別的app程序導致的,和你的游戲app并沒有直接的關系。
(2) 手機游戲開發(fā)的時候往往會根據游戲的”視覺品質”來進行配置,分為最高等的畫質與特效效果,中等畫質與特效效果,低端畫質與特效效果。我們首先要將用戶的機器進行分類,分成高中低三個檔次,每個檔次的機型我們適配匹配好對應的效果和特效。比如,高端機上跑高質量,中端機跑中質量,低端機跑低質量。當我們接收到用戶反饋的手機發(fā)燙的時候,首先要根據手機來判斷屬于哪一檔,來進行處理。比如低檔機跑高質量的畫質肯定會產生卡頓與發(fā)燙,這個時候我們要把對應的畫面質量與對應的性能做到匹配,做到每個檔次的機器在對等的畫質上能做到不發(fā)熱。不要出現機器與畫質不匹配與對等的情況。如果出現發(fā)燙,我們要統(tǒng)計出來是那個檔次畫面的哪種機型。比如中畫面質量在中檔手機上發(fā)燙。有時候我們一個檔次的畫面來適配全部的高中低端機,那么這個時候可以考慮將畫面參數進行調節(jié)來適配。
(3) 如果同一個檔次畫面質量在同一檔的機型上發(fā)熱,那么就是性能優(yōu)化的問題了。我們能做的就是提升程序的性能,讓CPU有更多的休眠時間,從而解決發(fā)熱。做性能優(yōu)化定位問題的時候我們要確定好是哪個部分占用的CPU+GPU資源導致發(fā)熱。一個一個模塊的排查: 渲染模塊,物理引擎模塊,邏輯算法模塊,其它,排查的時候,我們一般會一個一個的內容重建,比如,排查渲染模塊,我們可以只做渲染,做同等規(guī)模的游戲地圖與渲染單元,查看運行結果,分析CPU占用率,看是否引起發(fā)燙。物理引擎模塊可以通過增加和減少物理計算單元來定位是否為物理引擎的問題。隔離掉邏輯算法代碼,看CPU占用率是否有改善。如此根據自己的游戲邏輯逐步定位性能熱點。
(4) 在游戲開發(fā)項目中,越早進行機器的性能測試,是否發(fā)熱等指標,能幫助我們快速的定位是加入了哪些功能導致了機器發(fā)熱,同時測試機器最好都準備幾個有代表性高中低端手機。一般我們做項目的時候,每個禮拜都會完整的真機測試有代表性的機器。
?
(5) 超規(guī)模的資源占用,導致OS操作系統(tǒng)的系統(tǒng)進程CPU占用率飆升。比如系統(tǒng)的內存時1G,你游戲的內存占用了2G,這樣可能會導致操作系統(tǒng)不斷的與磁盤swap進行數據交換釋放物理內存來滿足內存訪問,從而導致系統(tǒng)負擔過重,系統(tǒng)進程服務的CPU占用率飆升,導致手機發(fā)燙。
?
3 針對性常用優(yōu)化手段與策略?
接下來給大家列舉一些針對性的優(yōu)化方向供大家參考和指導,每一項優(yōu)化都有很多資料,具體的操作大家可以查找相關的資料,或者查閱我們往期相關的優(yōu)化技巧。
(1) 做好高中低端機型的適配, 高端手機上高端效果,低端手機上低端效果,比如高端手機正常,低端手機發(fā)燙,可以針對低端機考慮關閉光照計算,關閉陰影計算,切換一些更簡單的shader, 關閉一些特效。 指定一些規(guī)則,然后游戲運行后自動判定分類手機的類型,來開關相關的參數。
(2) 調整以下目標運行時候的最高FPS, 默認情況下游戲引擎控制FPS在60左右,如果我們中低端機所有的優(yōu)化已經搞完了,雖然畫面流暢,但是手機還是發(fā)燙,就可以看下游戲運行中實際的FPS,如果游戲的實際FPS 超過了一個流暢運行的最低限制(一般是30FPS),可以考慮根據機型適配游戲的最高FPS為30,這樣導致的結果就是CPU拼命的工作讓實際幀率維持在60FPS,你減少最高幀率到30FPS,這樣CPU幀率到了30就可以休眠一點時間,從而維持流暢的情況下減少發(fā)熱。
(3) 渲染常用的優(yōu)化手段: 優(yōu)化渲染規(guī)模,使用增強細節(jié)的手段來代替模型面數,提升shader性能。空間換時間來提前預制烘培,合并drawcall, 減少set pass call,優(yōu)化動畫組件將頂點動畫烘培到紋理中。等等。
(4) 物理引擎的常用優(yōu)化手段: 修改物理引擎迭代計算的參數,降低剛體迭代的數目,使用更高效的方式替代物理引擎。等等。
(5) 優(yōu)化數據結構內存占用與算法: 緩存池減少節(jié)點反復大規(guī)模的刪除與創(chuàng)建,優(yōu)化算法,降低算法復雜度,空間換時間(預先計算好結果存儲起來,運行時查表即可),時間換空間,多線程優(yōu)化等??梢园巡糠值挠嬎惴诺紾PU中。等等。
?
定位好問題,認真分析后針對性的來解決對應的點就可以了。我們大部分的同學不會做性能調優(yōu)主要是問題定位沒有思路,定位不準確,技術手段不熟練,從而導致了找不到問題,找到了問題不知道下什么手段。關注我們可以獲得更多性能調優(yōu)的文章與課程。
?