[英]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.