你好安卓开发者,
我正在 Eclipse 中使用 OpenGLES 1.0 为 Android 开发一个简单的游戏。我使用 Samsung 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
And then
StartTime = System.currentTimeMillis(); //
UpdateLogic(1.0 / CONST_FPS);
Render();
30 FPS 下游戏非常流畅,主要是因为它不需要锁定 FPS。
但是,当尝试将 60 FPS 锁定到 30 FPS 时,我会出现卡顿。我做了一些研究,发现 Thread.Sleep() 并不精确。这是真的?当锁定 60FPS 到 30FPS 时,我还能做些什么来让游戏更流畅。
感谢你的回答 ...
您应该使用经过的时间来缩放所有运动,以便运动在不同的 FPS 速率下保持平滑。您可以这样获取经过的时间:
long currentTime = System.currentTimeMillis();
float elapsed = (System.currentTimeMillis() - lastFrameTime) * .001f;//convert ms to seconds
lastFrameTime = currentTime;
然后以每秒单位表示速度,并像这样更新位置:
sprite.x += (sprite.xspeed * elapsed);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)