问题描述
我正在尝试使用Java和OpenGL ES 2.0制作一个小型android游戏。 目前,我正在尝试创建一个良好的游戏循环,以使物体在移动时保持平稳。 我尝试了4种方法,但是所有这些方法都使我不高兴。
这是我的方法:
方法1:
@Override
public void onDrawFrame(GL10 gl)
{
game.update(1.0f / 60.0f);
game.render();
}
结果:
大约所有2秒都有一点滞后/延迟。 在两秒钟之间,它的滑落非常平稳。
方法二:
@Override
public void onDrawFrame(GL10 gl)
{
newTime = System.currentTimeMillis();
delTime = newTime - oldTime;
oldTime = newTime;
game.update(delTime / 1000.0f);
game.render();
}
结果:
大约所有2秒钟都有一点滞后/延迟,与“方法1”完全相同。 在两秒钟之间,它的滑落非常平稳。
方法3:
@Override
public void onDrawFrame(GL10 gl)
{
newTime = System.currentTimeMillis();
delTime = newTime - oldTime;
oldTime = newTime;
lagTime += delTime;
// 18ms ~ 55 Frames per second
while(lagTime >= 18)
{
game.update(18 / 1000.0f);
lagTime -= 18;
}
game.render();
}
结果:
大约所有0.5秒都有一点延迟/延迟。 感觉从来都不流畅。
方法4:
@Override
public void onDrawFrame(GL10 gl)
{
newTime = System.currentTimeMillis();
delTime = newTime - oldTime;
oldTime = newTime;
lagTime += delTime;
// 18ms ~ 55 Frames per second
while(lagTime >= 18)
{
game.update(18 / 1000.0f);
lagTime -= 18;
}
// Render all linear interpolated dependent on the lag time.
game.render(lagTime / 1000.0f);
}
结果:
大约所有2秒都有一点延迟/延迟,与“方法1”和“方法2”完全相同。 在两秒钟之间,它的滑落非常平稳。
摘要:
我很确定我没有分配内存,因此GC不能正常工作,但是还有什么会导致所有2秒的延迟?
以及为什么GLSurfaceView每秒准确地每秒60次调用“ onDrawFrame”方法而我却不做(有时也每秒58或62次),我认为它经常调用该方法并且60 FPS听起来不是随机的,所以有可能指定此速率以及在其他设备上的行为方式?
那么,对于一个带有快速移动物体的简单2D游戏,那么没有这种滞后要花2秒钟的所有时间的简单好方法到底是怎么回事呢(所以40-60 FPS应该是最小的)?
如果重要的话,我在Android 5.1.1上的Nexus 7(2013)上测试了这些方法。
1楼
好的,尝试解决此问题几天后,我找到了另一个解决方案。 现在,我仅将平均增量时间设为5帧。 这似乎工作得更好,但并不完美。
2楼
为什么需要在While语句中将18.f / 1000.f传递到函数中?
在游戏循环的While循环中调用update()并不常见。 无需代码检查FPS和while循环即可再次对其进行测试。
如果什么都没有发生,我将怀疑是否有什么东西正在分配。
更新
80ms,无话可说,没办法,增量时间应该小于20ms。 我认为很容易找到原因。 尝试运行一个使用opengl es视图的官方android示例,如果再次发生,则由于设备问题,没人知道它是什么。 但是,我认为将其与具有主要活动的GLSurfaceview中的示例代码进行比较可以很好地工作,或者您可以在此处向我展示您的整个代码,因为它应该很简短。