今天研究了一下cocos2dx-3.0帧限制问题,按引擎提供的接口,修改
director->setAnimationInterval(1.0 / 30);
希望把程序控制在30帧以下。编译程序跑了一下,在WIN和IOS平台下有效,但是android却一直坚挺在60帧左右。研究了一下cocos源码。
在Cocos2dxRenderer.java中定义了一个静态变量:
private static long sAnimationInterval = (long) (1.0 / 60 * Cocos2dxRenderer.NANOSECONDSPERSECOND);
这里写明了帧间隔时间,但是引擎里并没有使用这个,而且是把限制的代码注释了,提示说限制算法是不正确的,在同样的设备上,帧限制可能比预期要慢,所以注释掉了。说明程序根本没限帧,提示是假的,程序一直在空跑,竞争CPU。我把注释放开,在模拟器上跑了一下,设置了35帧/秒,但跑起来有50帧/秒。自己修改了一下算法:
1. 在sAnimationInterval变量下面加一个变量定义:
private static long renderingElapsedTime = sAnimationInterval;
2. 重写onDrawFrame函数:
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帧/秒,结果是34、33帧/秒。