0

使用 Android 和 OpenGL,我调用了一个 drawFrame(GL10 gl) 方法,该方法在系统准备好渲染另一帧时绘制。

在一个单独的游戏循环线程中,我控制更新和碰撞检测测试。

我有一个相机跟踪一个与地面静止的物体。物体被加速力拉下,但物体检测到它与地面的碰撞并将自己定位回它应该在的位置。

因为我有两个线程,所以当模拟只是坐在那里时,有时渲染线程会在物体被拉到地下时绘制物体,在碰撞检测系统有时间重新定位物体之前。结果是相机偶尔会随机上下摆动。

我读过你可以控制何时调用 drawFrame 方法,这可以解决我的问题,但我听说你也不应该这样做。为什么我不应该这样做,有什么方法可以解决我的问题?

4

1 回答 1

0

您希望在所有更新(物理和碰撞)完成之前避免渲染线程“潜入”。这应该通过使用同步来解决。

然而,如果你锁定整个事情,你会让更新线程等待所有渲染完成,反之亦然,这不是一个好主意。因此,我建议您为渲染线程使用正在更新的变量的“副本”。在某些情况下(例如,当您更新顶点位置时)这些副本是隐含在 GPU 上的。在其他情况下(例如您的相机位置),您必须明确定义它们。

为了说明我的意思:

update() {
  synchronized(lock) {
    doPhysics()
    doCollision()
  }
}

draw(GL gl) {
  synchronized(lock) {
    transferToGLVariables()
  }
  render(gl)      
}

这样您就不必控制渲染线程何时渲染,我认为这是一种更强大的方法。

于 2013-08-06T02:47:44.773 回答