最近在測試過程中發現了一些比較典型的效能問題,所以來分享下作為測試怎麼為解決問題提供更多的有效資訊,本次主要從優化角度分析perfdog測試報告。本次主要介紹關於cpu的優化;
怎麼獲取測試報告此處不再贅述,有關perfdog怎麼使用的教程可以參考
perfdog使用教程
首先我們看到fps資料,可以看到fps波動較大,但這是從某一時間開始的,在前期遊戲fps還是較為穩定的,那我們就要分析是什麼原因導致的fps開始變得不穩定;
我們發現cpu的消耗在這個時間段開始驟然上公升,cpu的溫度公升高,導致手機的降頻保護開啟,cpu的頻率開始下降,
經過以上的資料分析,我們發現是遊戲在那個時間點時cpu消耗上公升,導致cpu的溫度公升高,處發了cpu的保護機制,引起cpu頻率下降,而遊戲得不到充足的算力支援,自然fps變得不穩定;
我們已經得知問題是cpu溫度過高的問題,那麼就要相應降低cpu的消耗,而cpu的消耗主要有以下幾個方面(這裡僅針對unity引擎的,其他引擎僅供參考)
對於mmorpg手遊:
cpu的消耗可以從半透明渲染和不透明渲染入手解決;
可能有的同學會疑問,渲染通常都是gpu做的,和cpu有毛線的關係,這裡要解答一下,
在安卓機器設計結果中目前大部分都是沿用的馮·諾依曼結構,也就是我們通常說的計算機的五大部件:
運算器、控制器、儲存器、輸入裝置、輸出裝置, 而運算器、控制器組合就是cpu,所以算力通常都是由cpu提供的,而如果不在遊戲中另做設定的話,即使渲染也是由cpu提供的算力,而gpu就是為了減輕cpu的這種渲染壓力而設計出來的乙個部件,嚴格意義上來講也屬於運算器;
所以為了減輕壓力,我們要把一些算力分給gpu,減輕cpu的負擔,而unity常用的手法有以下幾種:
1.開啟gpu instancing,降低drawcall:
該技術可有效降低draw call的占用,從而對渲染模組的cpu端壓力起到一定的緩解作用。但是,在使用該技術時,需要注意機型的測試,此技術僅可以用於opengl es 3.0,而且一些低端裝置雖然支援opengl es 3.0,且systeminfo.supportsinstancing api返回也為true,但經過實際測試時,其底層並沒有按照真實的gpu instancing功能來進行渲染,而是通過逐個draw call來進行渲染,所以,雖然開啟了gpu instancing功能,但其渲染耗時並沒有下降;
這裡涉及到了drawcall,簡單介紹一下:
drawcall是cpu對底層圖形繪製介面的呼叫命令gpu執行渲染操作,一次渲染就是乙個drawcall
渲染流程採用流水線實現,cpu和gpu並行工作,它們之間通過命令緩衝區連線,cpu向其中傳送渲染命令,gpu接收並執行對應的渲染命令,過多的drawcall會造成cpu的效能瓶頸:大量時間消耗在drawcall準備工作上。很顯然的乙個優化方向就是:盡量把小的drawcall合併到乙個大的drawcall中,這就是批處理的思想,也就是gpu instancing主要做的事情;
但要注意不要過於消耗gpu,在開發遊戲過程中隨著pbr、影象後處理的大量使用會導致gpu端的壓力越來越大,甚至影響到了cpu端的draw call無法正常傳輸。可以說,主線程等待時間的體現方式因晶元的不同、具體使用情況的不同和引擎版本的不同,可謂是五花八門,在這裡不一一進行說明,但歸根原因主要還是gpu壓力過大;
2.注意控制gc觸發頻率很
隨著mmorpg遊戲越來越重度化,gc平均耗時在逐步上公升,也會造成卡頓,大量的gameobject在頻繁例項化和destroy會造成很大的效能開銷;
3.shader.parse
這裡給出一些建議,
1)shader在遊戲執行過程中是否存在冗餘情況,即重複載入的情況;
2)是否有自定義的shader資源放入到always included中,如有,請盡量去除;
3)移動端上standard shader的使用是否確實有必要。沒有必要,則詳細檢測並刪除。
4.動畫模組
大量動畫的產生會產生嚴重的開銷,unity引擎可以考慮使用gpu skinning的方式進行優化,這種方式對於實現場景中的大量同種怪物非常有效,可以減少很多開銷。其核心其實也是合批的思想;
5.粒子系統
這裡建議盡可能將粒子使用數量峰值控制在600以下(低端裝置)和1000以下(中高階裝置),
可以檢查下
1)粒子系統(特別是技能特效)的配置檔案是否過量;
2)特效中是否含有長久不用的粒子系統。
以上是結合perfdog的測試報告針對在遊戲開發中cpu優化的一些常用手段,相信可以帶來一些啟發,大家可以根據自己的專案實際情況做參考;減少cpu的消耗,降低cpu的溫度。
CVI減少CPU佔用率
當設計cvi程式時,會發現cvi程式占用cpu的資源很多。接下來討論下為何減少cpu的佔用率。當程式執行runuserinte ce 函式時,cvi的執行引擎處於乙個連續的迴圈中,等待系統事件。為了內部狀態有效,cvi需要處理 並分派這些事件。每次在這個迴圈中,根據使用者的休眠策略進入休眠狀態。雖然...
Unity優化之減少Drawcall
簡單來說,drawcall就是螢幕渲染一次所需要的開銷,為了較少消耗,提高效能,一般有以下幾種方法。一 批處理 1.動態批處理 如果動態物體共用著相同的材質,那麼unity會自動對這些物體進行批處理。動態批處理操作是自動完成的,並不需要你進行額外的操作,你可以在buildsetting中設定他。動態...
Chrome瀏覽器將獲得改進 減少CPU占用及功耗
身為全球第一大pc瀏覽器,份額達到7成的chrome,依然難稱完美,使用者主要吐槽的點包括cpu 記憶體占用高 功耗大等。其實早在2017年,谷歌工程師就提程式設計客棧出一uqhsusj項建議性改進,即在全屏 時降低垂直同步重新整理率,然而好點子一直被擱置到現在,程式設計客棧知道最近才被谷歌團隊重新...