恒定FPS Android OpenGLES

Sli*_*ide 3 android frame-rate constants opengl-es frame

你好android开发者,

我正在使用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
    }                           
}
Run Code Online (Sandbox Code Playgroud)

CONST_FPS = 30的地方

然后

StartTime = System.currentTimeMillis(); //

UpdateLogic(1.0 / CONST_FPS);
Render();
Run Code Online (Sandbox Code Playgroud)

30 FPS的游戏玩法非常流畅,主要是因为它不需要锁定FPS.但是,当试图将60FPS锁定到30 FPS时,我会出现口吃.我做了一些研究,发现Thread.Sleep()不准确.这是真的?当将60FPS锁定到30FPS时,我还能做些什么来使游戏更加流畅.

谢谢你的回答 ...

Luk*_*uke 6

您应该使用经过的时间来缩放所有移动,以便移动在不同的FPS速率下保持平滑.您可以像这样获得经过的时间:

long currentTime = System.currentTimeMillis();
float elapsed = (System.currentTimeMillis() - lastFrameTime) * .001f;//convert ms to seconds
lastFrameTime = currentTime; 
Run Code Online (Sandbox Code Playgroud)

然后以每秒为单位表达你的速度,并像这样更新位置:

sprite.x += (sprite.xspeed * elapsed);
Run Code Online (Sandbox Code Playgroud)