Egret性能優化之優化-----渲染


此篇轉載自 https://ashan.org/archives/522

有人說Egret的性能不好,甚至沒有原生JS寫出來的性能高效。其實大部分時候都是由於開發者所使用的方法不正確。導致游戲性能下降,甚至出現卡頓的現象。

游戲作為性能消耗大戶,很多時候都會將系統硬件的性能使用到極致。想要提高你的游戲性能,有一個非常重要的前提。你需要對引擎渲染部分非常了解。能夠在開發中避免不必要的低級錯誤。

這篇文章簡單的聊一聊渲染部分的優化。如果你的優化做的好,那么就會解決絕大部分性能問題。

在說優化之前,你需要非常清楚Egret的Main Loop。如果對此不了解。那么你擁有非常高的幾率寫出擁有嚴重性能問題的游戲。

Egret在內核中是如果來處理渲染部分的呢?請看下圖

屏幕快照 2015-03-20 下午1.56.43

Egret每刷新一幀的時候,會執行四步操作。你在制作游戲的時候應該清晰的記住四步操作都在干什么。

第一步,我們執行了一次EnterFrame,此時,引擎會執行游戲中的邏輯。並且拋出EnterFrame事件。 如果你在這里編寫了大量消耗性能的代碼,那么你的幀頻就會開始下降。你應該明白,不要將大量代碼都放到EnterFrame中去處理。除非你想讓你的用戶體驗一個慢世界的游戲。

第二步,引擎會執行一個clear。將上一幀的畫面全部擦除。

第三步很有意思,不僅僅是有意思,也是非常消耗性能的一步。此時,Egret內核會遍歷你游戲場景中的所有DisplayObject,並重新計算所有顯示對象的transform。

最后一步,如果你接觸過canvas,那么你了解,這一步會將所有的圖像全部draw到畫布中。

好了,簡單的了解了Egret渲染機制,那么到底如何去優化我們的游戲。我簡單羅列一下基本要素。具體如何避免,解決方案怎么操作,每一個都會擴展出無數內容。在后面的文章我會依次講解。

1、不想要的DisplayObject,請removeChild 如果是設置了他的visible屬性為false,確實這個顯示對象不會被渲染出來。但是,它還會參加第三步的計算過程。所以無形中增加了性能開銷。 如果某一個圖像被其他圖像遮蓋,那么你就需要移除被遮蓋的對象。

2、不要向stage中放置太多的DisplayObject 就如同天朝的人口數量一樣,什么東西多了都是噩夢。太多的顯示對象不僅僅在第三步會消耗性能,更重要的是,在第四步的時候,會嚴重影響性能。讓幀頻下降。 如果作為程序員你的抱怨設計師或者策划師在游戲中添加了太多內容的話。那么我可以給你一個不錯的建議。 你可以想辦法將畫面中的元素進行合並。合並不是將兩個Bitmap塞到一個Sprite中。這樣並不能起作用。無論是嵌套還是並列,都會消耗大量性能。如果可以,你最好調整游戲元素圖片的拆分方式,盡量減少DisplayObject的數量。 另外一種方法是使用cacheAsBitmap,讓你的矢量圖在運行時以位圖形式進行計算。這會大大減少你的矢量圖運算。

3、盡量不要在EnterFrame事件中做過多的操作 不得不說,EnterFrame事件派發的太頻繁了。在如此高密度的事件中。每執行一次邏輯操作,都要付出非常多的性能代價。 你可以嘗試自己定義更多的事件,在某種條件成立時,手動派發自定義事件

4、善用臟矩形 臟矩形是一種非常高效的優化手段,但它也是把雙刃劍。用的好,性能飆升,用不好,自取滅亡


免責聲明!

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



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