获得可怕的“迭代器不能使用嵌套”异常

时间:2014-02-11 12:28:37

标签: libgdx

在我的3D游戏中随机获取此异常(使用2014年至2014年的每晚构建的libgdx)。有时几天没有,有时10分钟就有5次。几乎从未在模拟器上发生过。现在几周都没有找到任何可重复的场景,即使我根本没有碰到平板电脑也可能发生。 (我有一种感觉,移动相机或触摸屏幕会导致更高的概率,但无法证明这一点。)通常发生在长工作线程(计算机“思考”,连续渲染在此期间关闭)完成时一些模型正在重新定位以显示结果。

始终在由100个节点组成的同一模型实例上发生(每个节点是由六个rect()调用创建的纹理框)。某些节点可能处于短动画中。我没有在我自己的代码中的任何地方请求迭代器,我通过正常的for()循环遍历节点,因为它们的数量是固定的。

对于如何开始调查这一点的任何建议表示赞赏。当我将上述框作为100个不同的模型实例时,我可能会遇到的唯一线索是,异常发生的频率有所降低。今天我将它们合并为一个大型模型,已经有10次例外。

E/AndroidRuntime(30999): com.badlogic.gdx.utils.GdxRuntimeException: #iterator() cannot be used nested.
E/AndroidRuntime(30999):    at com.badlogic.gdx.utils.Array$ArrayIterator.hasNext(Array.java:487)
E/AndroidRuntime(30999):    at com.badlogic.gdx.graphics.g3d.ModelInstance.getRenderables(ModelInstance.java:356)
E/AndroidRuntime(30999):    at com.badlogic.gdx.graphics.g3d.ModelInstance.getRenderables(ModelInstance.java:328)
E/AndroidRuntime(30999):    at com.badlogic.gdx.graphics.g3d.ModelBatch.render(ModelBatch.java:281)
E/AndroidRuntime(30999):    at com.badlogic.gdx.graphics.g3d.ModelBatch.render(ModelBatch.java:296)

1 个答案:

答案 0 :(得分:1)

这似乎是一个线程问题。我的大多数模型都是通过AnimationController进行操作的,但是有一个地方从另一个线程发出了直接移动:

modelInstanceTiles.nodes.get(nodeIndex).translation.set(pos);
modelInstanceTiles.nodes.get(nodeIndex).rotation.set(rot);
modelInstanceTiles.calculateTransforms();

我已将此更改为非常快速的动画,现在已经3天没有例外。