android - 恒定 FPS Android OpenGLES

标签 android opengl-es constants frame frame-rate

你好安卓开发者,

我正在使用 OpenGLES 1.0 在 Eclipse 中为 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

然后

StartTime = System.currentTimeMillis(); //

UpdateLogic(1.0 / CONST_FPS);
Render();

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

关于android - 恒定 FPS Android OpenGLES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11381543/

相关文章:

android - android xml布局中的分隔符问题

android - 矩阵调色板,模型 View 矩阵时的绘图问题

android - 如何使用近距离和远距离识别 3D 对象内部或外部 3D 对象的点击

c++ - 从 DLL 导出常量

language-agnostic - 非静态的私有(private)常量有什么用处吗?

android - 强制停止(杀死)应用程序后是否有可能在Android应用程序中获取位置更新

android - Ajax 请求在 Android 应用程序中被阻止

android - 限制 gridview 中的项目数

Android: Canvas 与 OpenGL

PHP OOP 属性常量用法