使用Android和OpenGL我调用drawFrame(GL10 gl)方法,该方法在系统准备渲染另一帧时绘制。
在一个单独的游戏循环线程中,我控制更新和碰撞检测测试。
我有一个相机跟随一个与地面休息的物体。物体被加速力拉下,但物体会检测到它与地面的碰撞,并将自身定位回应该的位置。
因为我有两个线程,当模拟只是坐在那里时,在碰撞检测系统有时间重新定位对象之前,有时渲染线程在将对象拉到地面以下时绘制对象。结果是随机时间偶尔会上下摆动的相机。
我已经读过你可以控制何时调用drawFrame方法,这可以解决我的问题,但我听说你也不应该这样做。为什么我不应该这样做以及解决问题的方法是什么?
答案 0 :(得分:0)
您希望在完成所有更新(物理和碰撞)之前避免渲染线程'偷偷摸摸'。这应该通过使用synchronized来解决。
如果你将整个事情锁定,那么你有更新线程等待所有渲染完成,反之亦然,这不是一个好主意。因此,我建议您为要使用的渲染线程更新要更新的变量。 在某些情况下(例如,当您更新顶点位置时),这些副本隐含在GPU上。在其他情况下(例如您的相机位置),您必须明确定义它们。
说明我的意思:
update() {
synchronized(lock) {
doPhysics()
doCollision()
}
}
draw(GL gl) {
synchronized(lock) {
transferToGLVariables()
}
render(gl)
}
这样你就不必控制渲染线程什么时候渲染,我认为这是一种更强大的方法。