Laya性能優化

#<center>Laya性能優化</center> ##一、減少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倍以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章