簡體   English   中英

使用OpenGL ES進行手指畫。 我究竟做錯了什么?

[英]Finger paint using OpenGL ES. What am I doing wrong?

我想用opengl構建一種繪畫應用程序,我遵循了這些說明。

但是,當我多次觸摸屏幕時,出現錯誤消息:“應用已停止。” 和例外:

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);
        }

    }

我正確地更新並重新定義了矢量,因此我猜這不是錯誤。 我猜該錯誤與線程有關,但我不知道如何解決。

您可能正在通過GUI線程更改OpenGL緩沖區的大小,而OpenGL不斷從其自己的線程訪問緩沖區,從而導致段錯誤。

確保僅在OpenGL線程本身執行的代碼中觸摸緩沖區,而不在其他線程中觸摸緩沖區。

如果必須訪問線程之間共享的變量,請將變量放在Java synchronized塊中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM