我正在尝试使用Java和OpenGL ES 2.0制作一款小型Android游戏。 目前,我正在努力创造一个良好的游戏循环,以获得平滑的感觉,例如对象正在移动。 我尝试了4种方法,但所有这些方法都让我感到不快乐。
这是我的方法:
方法1:
@Override
public void onDrawFrame(GL10 gl)
{
game.update(1.0f / 60.0f);
game.render();
}
结果:
大约所有2秒都有一点延迟/延迟。 在2秒之间,它真的很顺利。
方法2:
@Override
public void onDrawFrame(GL10 gl)
{
newTime = System.currentTimeMillis();
delTime = newTime - oldTime;
oldTime = newTime;
game.update(delTime / 1000.0f);
game.render();
}
结果:
大约所有2秒都有一点滞后/延迟,与“接近1”完全相同。 在2秒之间,它真的很顺利。
方法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”完全相同。 在2秒之间,它真的很顺利。
要点:
我很确定我没有分配内存,因此GC无法工作,但还有什么可能导致这些滞后2秒?
为什么GLSurfaceView每秒正好调用“onDrawFrame”方法60次而没有我做(有时候每秒58或62次)我认为它经常调用方法而且60 FPS听起来不是随机的是否可以指定此速率以及其在其他设备上的表现?
所以最后一个很好的简单方法是没有这个延迟,所有2秒的时间用于一个简单的2D游戏,快速移动的物体(所以40-60 FPS应该是最小的)?
如果它很重要,我使用Android 5.1.1测试了Nexus 7(2013)上的方法。
答案 0 :(得分:1)
好的,经过几天试图解决这个问题后,我找到了另一个解决方案。 现在我只需要花费大约5帧的平均增量时间。 这似乎更好但不完美。
答案 1 :(得分:0)
为什么需要将18.f / 1000.f传递给While语句中的函数?
在游戏循环中调用While循环中的update()并不常见。 在没有代码检查FPS和while循环的情况下再次测试它。
如果什么都没发生,我会怀疑是在分配什么。
<强>更新强>
80ms没有任何可以调用,没有办法,delta时间应该小于20ms。我觉得很容易找到原因。尝试运行一个使用opengl es视图的官方android示例然后如果它再次发生,没有人知道它是什么因为设备问题。但是,我认为它可以很好地与GLSurfaceview中的主要活动的示例代码进行比较,或者您可以在GLSurfaceview中向我展示您的整个代码,因为它应该是安静的。