使用OpenGL ES进行手指画。我在做什么错了?

时间:2018-06-28 18:07:14

标签: java android opengl-es

我想用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);
        }

    }

我正确地更新和重新定义了矢量,因此我猜这不是错误。我猜该错误与线程有关,但我不知道如何解决。

1 个答案:

答案 0 :(得分:0)

很有可能您正在从GUI线程更改OpenGL缓冲区的大小,而OpenGL不断从其自己的线程访问缓冲区,从而导致段错误。

确保仅在OpenGL线程本身执行的代码中触摸缓冲区,而不在其他线程中触摸

如果必须访问线程之间共享的变量,请将变量放在Java synchronized块中。