你好,安卓开发者,
我正在使用opengles 1.0为eclipse中的android开发一个简单的游戏。我使用三星galaxy s2 android(2.3)作为开发设备。
我有一个关于双核和使帧速率恒定的问题。
所以我成功地创建了glsurfaceview和override ondrawframe()函数,在这里我调用了logicupdate(deltatime)函数和render()函数。
是的,现在都是单线程的。
我遇到的问题是双核。如果我通过设置->节能和检查系统节能禁用双核,我会意识到渲染会自动锁定在每秒30帧。但如果我通过取消选中系统节能来启用双核,我会看到渲染速度锁定在每秒60帧,但手机会变热,耗电速度非常快。
所以我的想法是让我的游戏以每秒30帧的速度运行以节省一些电池。
为此,我使用下面的代码。
在进行逻辑更新之前,请记住所有这些都是在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();

30帧/秒的游戏非常流畅,主要是因为它不需要锁定帧/秒。
但是,当我试图将每秒60帧锁定到每秒30帧时,我会口吃。我做了一些研究,发现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);

10-06 12:59