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时,我还能做些什么来使游戏更加流畅.
谢谢你的回答 ...
您应该使用经过的时间来缩放所有移动,以便移动在不同的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)