我想用opengl构建一种绘画应用程序,我遵循了these的说明。
但是,当我多次触摸屏幕时,会出现错误消息:“应用已停止。”例外:
tid 7210(GLThread 379)中的致命信号11(SIGSEGV),代码2,故障加法器0x7554d018
这是我的触摸事件代码:
public void processTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
x = event.getX();
y = event.getY();
// In this method I update the vector and I set "longTouch" (boolean variable) to true
addPoint(x, y);
break;
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
longTouch = false;
break;
}
}
我要遵循的逻辑是,当用户在DrawFrame中将手指拖到屏幕上时,“ longTouch”(布尔变量)被激活为true,然后创建或更新了顶点缓冲区和索引缓冲区,这些是发送以使用DrawElements绘制线条。
if (longTouch){
if (vertices.length >= 4){
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
index = new short[vertices.length];
for (short i = 0; i < index.length; i++){
index[i] = i;
}
ByteBuffer ibb = ByteBuffer.allocateDirect(index.length * 2);
ibb.order(ByteOrder.nativeOrder());
indexBuffer = ibb.asShortBuffer();
indexBuffer.put(index);
indexBuffer.position(0);
glVertexPointer(2, GL10.GL_FLOAT, 0, vertexBuffer);
glDrawElements(GL_LINES, index.length, GL_UNSIGNED_SHORT, indexBuffer);
}
}
我正确地更新和重新定义了矢量,因此我猜这不是错误。我猜该错误与线程有关,但我不知道如何解决。
答案 0 :(得分:0)
很有可能您正在从GUI线程更改OpenGL缓冲区的大小,而OpenGL不断从其自己的线程访问缓冲区,从而导致段错误。
确保仅在OpenGL线程本身执行的代码中触摸缓冲区,而不在其他线程中触摸
。如果必须访问线程之间共享的变量,请将变量放在Java synchronized
块中。