大家好,我正在使用OpenGLES 1.0在Eclipse上为Android开发一个简单的游戏。我使用三星Galaxy S2 Android(2.3)作为开发设备。
我有一个关于双核处理器和保持帧率恒定的问题。
所以我已经成功创建了GLSurfaceView并覆盖了onDrawFrame()函数,在这里我调用了LogicUpdate(deltatime)函数和Render()函数。
是的,现在所有的操作都在单线程中进行。
我的问题是关于双核处理器。如果我通过进入设置->省电模式并勾选系统省电来禁用双核处理器,我会发现渲染自动锁定在30 FPS。但是,如果我取消勾选系统省电来启用双核处理器,我会发现渲染被锁定在60 FPS,但手机会变得很热并且电池会非常快地耗尽。
所以我的想法是将游戏运行在30 FPS以节省一些电池电量。
为了实现这一点,我使用以下代码。
在执行逻辑更新之前,我调用了这段代码,记住所有这些都是在onDrawFrame()函数中完成的。
if( CONST_FPS > 0 && StartTime > 0 )
{
/////////////////////////////////////////////////////////////////
// Get frame time
////////////////////////////////////////////////////////////////
long endTime = System.currentTimeMillis();
long time = endTime - StartTime;
//
long wantedtime = 1000 / CONST_FPS;
//
long wait = 0;
if( time < wantedtime )
{
wait = wantedtime - time;
//
Thread.sleep(wait);
}
else
{
//Time to big game will slow down
}
}
常量 CONST_FPS 的值为 30。
然后
StartTime = System.currentTimeMillis(); //
UpdateLogic(1.0 / CONST_FPS);
Render();
游戏在30FPS下的玩法非常流畅,主要是因为它不需要锁定FPS。但是,当试图将60FPS锁定到30FPS时,会出现卡顿。我进行了一些研究,并发现Thread.Sleep()不精确。这是真的吗?还有什么其他方法可以使游戏在将60FPS锁定到30FPS时更加流畅。
感谢您的回答...