【发布时间】:2017-07-10 12:08:20
【问题描述】:
在我的简单 GLES20 应用程序中,我尝试在运行时添加一些对象以进行绘制。 在我的渲染器类中,我有 ArrayList of Squares:
private ArrayList<Square> mSquares = new ArrayList<Square>();
这是我的Square 课程。
如果在onSurfaceCreated 中创建Square,则可以很好地绘制。
但我真正想做的事。我需要在运行时通过单击按钮将新的Square 添加到mSquares 中并在onDrawFrame 中绘制正方形。
在我的 Renderer 类中,我创建了 AddFigure() 方法:
public void AddFigure(float x, float y, float z)
{ // color coords angle
mSquares.add(new Square("Red square", new float[] {1, 0, 0, 1}, new float[] {x, y, z}, 100f));
}
我通过单击我的 Activity 中的按钮来调用此方法:
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mGLRenderer.AddFigure(1f, 1f, 1f);
}
});
但它总是抛出这个异常:
E/AndroidRuntime: FATAL EXCEPTION: GLThread 220
java.util.ConcurrentModificationException
和
E/libEGL: call to OpenGL ES API with no current context (logged once per thread)
E/emuglGLESv2_enc: device/generic/goldfish-opengl/system/GLESv2_enc/GL2Encoder.cpp:s_glEnableVertexAttribArray:741 GL error 0x501
Info: Invalid vertex attribute index. Wanted index: 4294967295. Max index: 16
我尝试使用glBufferData 和glBufferSubData 以某种方式修复它,但没有成功。
也许有一个例子或wiki如何正确地做到这一点?
【问题讨论】:
-
ArrayList不是线程安全的,所以你应该让它同步尝试 Collections.synchronizedList()