今天研究了一下cocos2dx-3.0幀限制問題,按引擎提供的接口,修改java
director->setAnimationInterval(1.0 / 30); android
但願把程序控制在30幀如下。編譯程序跑了一下,在WIN和IOS平臺下有效,可是android卻一直堅挺在60幀左右。研究了一下cocos源碼。算法
在Cocos2dxRenderer.java中定義了一個靜態變量:
函數
private static long sAnimationInterval = (long) (1.0 / 60 * Cocos2dxRenderer.NANOSECONDSPERSECOND);
這裏寫明瞭幀間隔時間,可是引擎裏並無使用這個,並且是把限制的代碼註釋了,提示說限制算法是不正確的,在一樣的設備上,幀限制可能比預期要慢,因此註釋掉了。說明程序根本沒限幀,提示是假的,程序一直在空跑,競爭CPU。spa
我把註釋放開,在模擬器上跑了一下,設置了35幀/秒,但跑起來有50幀/秒。本身修改了一下算法:code
1. 在sAnimationInterval變量下面加一個變量定義:
接口
private static long renderingElapsedTime = sAnimationInterval;
源碼
2. 重寫onDrawFrame函數:
it
public void onDrawFrame(final GL10 gl) { long interval = 0; //sleep修正值 try { if (renderingElapsedTime < Cocos2dxRenderer.sAnimationInterval) { long sleepBefore = System.nanoTime(); Thread.sleep((Cocos2dxRenderer.sAnimationInterval - renderingElapsedTime) / Cocos2dxRenderer.NANOSECONDSPERMICROSECOND); interval = (System.nanoTime() - sleepBefore) - (Cocos2dxRenderer.sAnimationInterval - renderingElapsedTime); if(interval < 0) interval = 0; } } catch (InterruptedException e) { e.printStackTrace(); } long renderingStartedTimestamp = System.nanoTime(); Cocos2dxRenderer.nativeRender(); renderingElapsedTime = (System.nanoTime() - renderingStartedTimestamp); renderingElapsedTime = renderingElapsedTime + interval; }
最後在真機跑了一下設置35幀/秒,結果是3四、33幀/秒。io