我有一个包含 GameObjects 集合的 OpenGL 项目。我有一个线程,它是遍历对象并调用更新方法的游戏循环。此外,OpenGL 具有迭代对象并渲染对象的 drawFrame 方法。最后,我有 onTouchEvent 方法,它位于第三个线程中,它遍历对象并调用 onTouchEvent 方法的每个对象版本。
也就是说,当我的一个对象根据屏幕触摸移动位置时,我会在它之前的位置获得对象的重影图像。这是一个简单的闪烁,但非常烦人且非常明显。其他自由移动的物体(不是基于onTouchEvent)没有自身拖尾的重影,但是当调用onTouchEvent方法时位置发生变化的物体会产生重影。
我该如何防止这种情况发生?我已经将我的两种方法都包装在“同步(this)”中,但它仍然不起作用。
public void drawFrame(GL10 gl)
{
if(renderType == RenderType.r2D)
prepare2DDrawing(gl);
else if(renderType == RenderType.r3D)
prepare3DDrawing(gl);
synchronized(this)
{
camera.draw(gl);
for(GameObject obj:objects)
{
gl.glPushMatrix();
obj.draw(gl);
gl.glPopMatrix();
}
}
}
public void update(float time)
{
cds.testCollisions(objects);
synchronized(this)
{
camera.update(time);
for(GameObject obj:objects)
{
obj.update(time);
}
motions.clear();
}
}
public void onTouchEvent(MotionEvent e)
{
if(touchable == Touchable.TOUCHABLE)
{
synchronized(this)
{
for(GameObject obj:objects)
{
obj.onTouchEvent(e);
}
}
}
}