ゲームオブジェクトのコレクションを持つ OpenGL プロジェクトがあります。オブジェクトを反復処理して update メソッドを呼び出すゲーム ループであるスレッドがあります。さらに、OpenGL には、オブジェクトを反復処理してオブジェクトをレンダリングする drawFrame メソッドがあります。最後に、オブジェクトを反復処理し、onTouchEvent メソッドの各オブジェクト バージョンを呼び出す 3 番目のスレッドに onTouchEvent メソッドがあります。
つまり、オブジェクトの 1 つが画面のタッチに基づいて位置を移動すると、以前の位置にあるオブジェクトのゴースト イメージが表示されます。これは単純なちらつきですが、非常に煩わしく、非常に明白です。(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);
}
}
}
}