今天研究了一下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