Краска пальца с использованием OpenGL ES. Что я делаю неправильно? - PullRequest
0 голосов
/ 28 июня 2018

Я хочу создать своего рода приложение для рисования с opengl, и я следовал этим инструкциям.

Однако, когда я касаюсь экрана несколько раз, я получаю сообщение об ошибке: «приложение остановлено». и исключение:

Фатальный сигнал 11 (SIGSEGV), код 2, адрес ошибки 0x7554d018 в тиде 7210 (GLThread 379)

Это мой код для сенсорных событий:

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 голосов
/ 01 августа 2018

Вполне вероятно, что вы изменяете размер буфера OpenGL из вашего потока графического интерфейса, в то время как OpenGL постоянно обращается к буферам из своего собственного потока, вызывая ошибку сегмента.

Убедитесь, что вы касаетесь только своих буферов в коде, выполняемом самим потоком OpenGL, но не в другом потоке.

Если вам нужен доступ к переменным, совместно используемым потоками, поместите переменные в блок Java synchronized.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...