Laya性能優化


Laya性能優化

一、減少DrawCall

1、在LayaAirIDE中避免組件交叉渲染:

  要減少DrawCall,首先要了解底層的渲染原理。相鄰層次相同的圖集在渲染的時候會自動合並,這樣就可以減少DrawCall。所以要注意,盡量要保證圖集的圖片渲染順序是挨着的,如果是交叉渲染那就會增加DrawCall

如何改變圖片的渲染順序?

  打開UI編輯器的層級管理器,可以直觀的看出每一個圖片資源的層級關系。通過不同顏色的圓點進行區分。如果相同顏色的圓點被交叉打斷,那就會增加DrawCall數量,所以,要通過調整層次關系,讓相同顏色圓點的資源順序排列。

  除此之外,要盡量保證同一個面板中的所有資源是用同一個圖集,這樣就能減少提交的批次。

2、復用3D材質:

  3D游戲中的DrawCall數量主要是受材質的影響,同屏材質數量越多DrawCall數越多。所以盡量復用材質,LayaAir引擎會對復用的材質進行合並優化,所以DrawCall數量會相對的減少。

3、控制常用模型的面數:

  LayaAir引擎會對20個面以下的相同模型,自動動態合並,例如:特效和子彈等。所以在美術制作資源的時候,要對美術提出要求,對反復使用的模型盡量控制面數。

4、靜態場景的優化方法:

  對於材質相同的靜態場景,LayaAir引擎提供了靜態合並方法staticBathManager.combine(),使用后可以大量減少DrawCall數量。、

二、減少Sprite

1、減少層次嵌套:

  盡量減少不必要的層次嵌套,就可以減少Sprite數量。如:UI編輯器中用Button組件里面嵌套了Image組件。

2、非可見區域的處理:

  在非可見區域的對象盡量要從顯示列表移除,或者將對象設置visible = false。如果不設置,就會遍歷全部的顯示對象節點。存在大量的對象時,就會導致性能降低。visible = false的對象引擎也會進行計算每幀的改變,只是不對其進行渲染,所以最好還是removeChild掉。

3、設置cacheAs屬性(緩存屬性):

  對於容器內有大量靜態內容或者不經常變化的內容(比如:按鈕),可以對整個容器設置cacheAs屬性,這樣就可以大量減少Sprite的數量,顯著的提高性能。如果有動態內容,最好和靜態內容分開,以便只緩存靜態內容。緩存也是占用內存的。

4、3D模型數量控制:

  3D游戲的性能優化,不僅是程序的工作,美術也要有嚴格的制作標准。比如:在美術制作資源的時候,不影響效果與功能需求的前提下,盡量合並模型減少數量,可以減少Sprite數量,減少引擎渲染時的遍歷節點時間。

5、攝像機裁剪優化:

  對於大型的3D場景來說,模型的面數與材質非常多,但是遠處的部分幾乎是看不清楚,這時可以采用攝像機裁剪功能,將遠處看不清的模型與材質不渲染,結合場景霧效的話,並不影響美術效果,卻可以減少SpriteDrawCall的數量。

三、減少CPU消耗:

1、減少A*尋路的調用:

2、在每一幀里進行運算:

  通常掛機戰斗,大部分是需要客戶端運算的。運算之后再由服務端驗證。比如:與一只怪物的戰斗會面臨是否命中、是否暴擊、是否無敵等等很多屬性計算,然而游戲中大多數都不是一個一個怪物出來和你打,經常是要多個的。尤其是有一個玩法里,怪物會越來越多。如果怪物累加到100個,就視為失敗。如果我們每次攻擊都要計算100次怪物的狀態,那就會比較消耗性能。

如何降低CPU的消耗?

  把所有的目標(怪)放到一個列表里,根據玩法的不同,每一幀取出不同數量的怪。比如,怪物不多的時候取一兩個,怪物多的時候取十個,剩下的怪在下一幀里再運算。雖然顯示效果會有所延遲,但是傷害等數值的飄出等效果,因為不是同時出來,反而顯得更自然。最關鍵的是,CPU消耗會得到降低。

3、服務端推數據引發的運算技巧:

  過程:

  比如:客戶端收到服務端發來的大量信息,然后解析數據通知到相應模塊的controller,再到更新數據層,刷新界面顯示。有可能會在界面上添加或刪除各種顯示對象等等操作,每當服務端推數據過來,如果引發大量的運算,這時在進行一次性運算就會卡住。

  LayaAir里有一個方法,可以得到從這一幀的幀頭到目前經過了多少時間,如果經過的時間每達到一幀的正常時間,那就開始處理服務端的數據。雖然運算時間不會縮減,但是沒有造成卡住的現象。

4、分階段處理復雜界面:

  在游戲中會有大量復雜的界面,比如背包,當背包的數據很多的時候,如果第一次打開,就會創建大量的子對象,在創建大量對象的時候可能會卡,這時候界面可以按處理服務端數據一樣,按每一幀的時間分階段處理。這樣背包打開的時候,就會感覺到界面上的子元素是一個個的出來,沒有了卡頓現象。

5、對象池的使用:

  每次創建對象都會消耗CPU,所以使用對象池就可以避免大量對象的創建。如果我們每次對象使用完了都放到池子中,比如:怪物,子彈等,怪物被殺死了,不需要用了,就可以放到池子里,下次使用的時候可以直接從池子中拿,對象池沒有才需要創建。

  但是需要注意的是,對象池不能隨便用,通常用於經常重復使用和回收的對象,比如:怪、怪殺死后的經驗球、殺怪掉落的道具,技能效果、飄字、地圖分塊等等。

6、限制技能特效與飄字的數量:

  如果我們不限制飄字和特效的數量,不僅是效果根本看不清,更容易造成大量的CPU消耗,因此,限制技能特效與飄字等效果的創建和顯示數量,也是優化CPU消耗的策略之一。

四、減少內存占用

  在手機里通常留給游戲的內存並不多,尤其是ios系統,對內存的控制更加嚴格,如果內存占用過大,就可能會導致游戲崩潰。

1、資源的釋放:

  1)使用對象池不僅可以優化CPU,還可以減少對象創建時的內存消耗,所以,無論是2D項目還是3D項目,對於經常使用的對象都要適當的使用對象池。

  2)對於不用的資源,我們一定要釋放掉。但如果一會還需要用,那就不要輕易釋放。因為釋放后重新加載也會消耗性能。所以要根據不同的資源和策略進行權衡。

  比如:

    ①、UI資源,當玩家打開之后,一定時間之內沒有再次打開。那么就可以檢查這個UI的資源有沒有被其它地方使用,如果沒有,那就可以移除掉。

    ②、如果UI上有動畫,那么當UI界面被關閉的時候,沒有其它界面在使用這個動畫、也可以立即刪除這個動畫。

    ③、像角色、技能動畫、聲音等,也都是和UI一樣,一定時間之內沒有再次使用,就可以檢查是否在其它地方使用,如果沒有,就可以立即刪除。

    ④、如果游戲里需要切換地圖,那么地圖上掉落的道具等,都可以立即刪除。

    ⑤、需要注意:顯示對象的內存清空可以使用destory()方法。該方法會真正從內存中釋放並設置為null,但他並不清空顯示對象所用到的資源。

    ⑥、釋放資源方法有三種:手動釋放的方法cleatRes()clearTextureRes(),以及在資源管理器ResourceManage中將autoRelease = true,實現自動釋放。

     如果項目較大,建議不要采用自動釋放功能。因為這個功能只有在超出內存上限的時候,才會釋放資源。並且被自動釋放后,如果釋放的資源還在被其它地方使用,那么有可能還會出現一邊清一邊用,造成閃屏的現象。

     手動釋放的方法里,推薦使用clearTextureRes()方法,與以前的clearRes()相比,clearTextureRes()方法值消耗了texture使用的圖片資源,但會保留texture資源殼,在下次渲染的時候,發現texture使用的圖片資源不存在,則會自動恢復圖片資源用於顯示。而clearRes()方法會徹底銷毀texture,導致不能再使用。另外,clearTextureRes()能確保立即銷毀圖片資源,不用擔心銷毀失敗,而clearRes()則采用引用計數方式銷毀,如其他地方有資源引用,則資源無法被銷毀。

     Ps:如果大圖合集,無論是clearRes()方法還是clearTextureRes()方法都無法銷毀。如果手動管理的資源,可以關閉自動大圖合集的功能,或改變大圖合集的規則。

    ⑦、如果是3D資源需要釋放,只能是手動管理,使用despose()方法將資源從顯存中移除。如果積累太多資源沒有釋放,可能會引起崩潰,所以開發者需要有隨時將不用的資源移除的習慣。

2、圖集的規則

  一個按鈕原來的設計是138 * 305,由於顯存里會自動把寬高填充到2的整數冪(單張圖片,正常情況下會把小圖打成2整數冪的圖集)。所以顯存里就會變成256 * 512。如果進行等比縮放把尺寸改為116 * 256(是把128 * 256的圖縮放成116 * 256),那么顯存里就只有128 * 256。內存就減少到原來的1/4。

3、不在顯示區域里的對象不加載

  通常RPG類型游戲整個地圖會比較大,如果全部加載進來就會占用較多的內存,那么在這個時候,不在顯示區域的對象不去加載。就會節省內存。

4、不在視覺焦點的,可以適當縮小

  游戲玩家的視覺焦點一般都集中在主角上,對於不在視覺焦點區域的可以采用按比例縮小圖片的實際尺寸,在游戲里還原到100%的尺寸。這種方式也可以減少內存的占用。具體縮小比例建議:怪物、武器、翅膀可以縮到67%,技能25%或50%。

五、智能優化

  LayaAir引擎推出智能優化。主要功能是將大量的cacheAs靜態緩存優化,由手動變成了引擎的自動優化。
  最大的好處就是大幅降低開發者的優化門檻,只需要設置一個屬性,就可以開啟或關閉智能優化。開啟智能優化后,至少可縮短10天的優化工作量,而且可以把很多很難發現的優化點一次性優化成功。優化效果方面,不用項目會有所差異,FPS的提升在2倍以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM