Libgdx畫面FPS性能優化經驗

 最近做的一個遊戲類似植物大戰殭屍的風格,做完之後發現FPS一直不高,打無盡模式就相當的卡了,所以就研究了一下到底是什麼原因導致的。目前優化完FPS提高了35%,效果還是比較理想的,記錄一下經驗供分享。


【性能定位】

1. 可重現的DEMO

 先寫了個一可以重現問題的demo,另外還準備了一個看起來效果類似卻不出現問題的demo。這樣有比更容易找到問題。

2. 時間消耗在哪

 開啓jvirtualvm進行測試,很明顯內存是一切正常的,但是CPU消耗就異常了。反覆對比發現CPU消耗主要就是在“org.lwjgl.opengl.GL11.nglDrawElements”方法上,對比正常的demo,主要時間消耗是在“org.lwjgl.opengl.GL11.glDrawElements”方法上。前者調用了jni,後者就是直接調用,所以性能上有較大差距。但是這個時候還是很難知道到底爲什麼會這樣,這些代碼也都是被封裝了的,看不到源碼。

3. 定位代碼

 還是要找到大致問題代碼是在哪一塊,其實目前已經知道肯定是繪製的地方出問題了,所以用時間打印的方法很快找到代碼,但是跟到最後就是一個內部的函數調用,外層方法完全看不出來有啥特別的。

4. 替換比較法

 還好準備了兩個有對比性的demo,不停的替換不一樣的地方去看看到底是哪裏引起的。這是一個笨辦法,但是通常都很奏效,但是也要點運氣,搞了幾個小時總算髮現了端倪。


【性能優化結論】

1. 繪製的性能與次數有關,與繪製最終所佔屏幕面積無關。也就是說你把100個圖片覆蓋整個畫面的性能和100個圖片繪製在同一個位置看起來像一個圖片的性能是相當的。

2. 圖片繪製的面積大到一定程度才影響性能。繪製工作肯定還是與面積有關,但是25%屏幕大小以內的圖片對性能影響幾乎沒有,但圖片達到80%屏幕覆蓋時會有大約40%的性能影響,不是成同等比例關係。

3. 圖片用Linear比Nearest要更消耗性能。當需要用到的Linear打包圖片數量達到幾十個的時候就需要注意性能,儘量改用Nearest算法,性能會有10%的提升。

4. 同一個打包合併的圖片連續使用可以大幅度提升性能(注:同一個pack下合併在不同圖片性能和2個pack是一樣差的)。在同一個pack的圖片,注意在addActor的時候連續添加,性能可以極大提升,甚至連續繪製幾百張圖片都不會對fps有太大影響,這也是爲什麼在libgdx有一個actor測試的時候有許多圖片感覺都不掉fps的原因。這個優化性能提升是在100%以上。

5. 畫面簡單,透明度較多的圖片性能更好。這個會減少繪製的負擔,當然圖片大到一定程度纔會感覺到差別,根據畫面複雜度可能會有20%的不同。

6. 大量的GROUP對象影響繪製性能。當GROUP對象使用達到幾十個的時候,哪怕只是包含一個Image的Group都會比簡單的Image繪製要消耗更多時間,幀數下降了10多幀。(2014年1月2日補充)

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