【问题标题】:box2d is out of syncbox2d 不同步
【发布时间】:2012-10-04 00:48:50
【问题描述】:

我在一个线程中调用world.step(timeStep, iterations, iterations),在另一个线程中调用Screen.render(),这个:

MyBox2DDebugRenderer.render(world, cam.combined);

一段时间后,我会得到

FATAL EXCEPTION: GLThread 2328
java.lang.IndexOutOfBoundsException: Invalid index 7, size is 7
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
    at java.util.ArrayList.get(ArrayList.java:304)
    at com.kingx.spacejourney.MyBox2DDebugRenderer.renderBodies(MyBox2DDebugRenderer.java:132)
    at com.kingx.spacejourney.MyBox2DDebugRenderer.render(MyBox2DDebugRenderer.java:74)
    at com.kingx.spacejourney.Universe.render(Universe.java:85)
    at com.badlogic.gdx.Game.render(Game.java:46)
    at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:449)
    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

MyBox2DDebugRenderer.java

130    int len = world.getContactList().size();
131    for (int i = 0; i < len; i++)
132        drawContact(world.getContactList().get(i));

所以在渲染时,box2d 世界正在发生变化。你有一些想法如何同步这个吗?我应该把它放在一个线程中吗?

【问题讨论】:

标签: java concurrency libgdx box2d


【解决方案1】:

正如您所说,box2d 世界在渲染时正在发生变化,这会产生这个线程问题。

您可以做的是使用 Java synchronizedprimitive 来确保一次只有一个线程能够访问 box2d 资源,即:

第一个线程(游戏更新):

synchronized(world){
   ...
   // Make the physics work by stepping into time
   world.step(1 / 50.0f, BOX_VELOCITY_ITERATIONS, BOX_POSITION_ITERATIONS);
   ...
}

第二个线程(渲染):

synchronized(world){
   ...
   // Your rendering
   MyBox2DDebugRenderer.render(world, cam.combined);
   ...
}

这里使用world不是唯一的选择,如果两个线程共存于同一个类中,您还可以使用对this的引用。

关于将所有内容放在一个线程中的选项,它肯定会解决您的问题。然而,在我看来,在两个线程中分离渲染和更新是一个好主意。首先,您将更好地使用您的 CPU 资源(它可能能够并行运行多个线程,在移动平台中也是如此)。其次,如果游戏更新速度和渲染速度分开,你的游戏会更容易扩展。

问候,

【讨论】:

  • 我认为这个答案的问题在于,OP 想要将他的 box2d 世界放在与 libGDX 渲染线程分开的线程中。问题是,如果你最终让渲染线程等待任何东西,libGDX 会以一种丑陋的方式死掉。
  • 实际上你必须让libGDX等待渲染,如果你必须...例如,你不能随时从box2d中删除对象。上述解决方案至少在我自己的代码中有效(参见here)。
  • 有没有办法让渲染线程等待?我发现box2d无论如何都是多线程的,所以在渲染线程中调用step可能没什么大不了的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多