2017-07-10 2 views
0

Dans mon application GLES20 simple j'essaye d'ajouter quelques objets dans l'exécution pour dessiner. Dans ma classe Renderer J'ai ArrayList des carrés:Comment ajouter des objets à dessiner à l'exécution en utilisant GLES20?

private ArrayList<Square> mSquares = new ArrayList<Square>(); 

Voici ma classe Square.

Square dessine bien si crée dans onSurfaceCreated.

Mais ce que je veux réellement faire. J'ai besoin d'ajouter de nouveaux Square en mSquares en cours d'exécution en cliquant sur le bouton et dessiner des carrés dans .

Dans ma classe Renderer j'ai créé AddFigure() méthode:

public void AddFigure(float x, float y, float z) 
{              // color     coords angle 
    mSquares.add(new Square("Red square", new float[] {1, 0, 0, 1}, new float[] {x, y, z}, 100f)); 
} 

J'invoque cette méthode en cliquant sur le bouton dans mon activité:

fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
       mGLRenderer.AddFigure(1f, 1f, 1f); 
     } 
    }); 

Mais jeter toujours cette exception:

E/AndroidRuntime: FATAL EXCEPTION: GLThread 220 
    java.util.ConcurrentModificationException 

et

E/libEGL: call to OpenGL ES API with no current context (logged once per thread) 
E/emuglGLESv2_enc: device/generic/goldfish-opengl/system/GLESv2_enc/GL2Encoder.cpp:s_glEnableVertexAttribArray:741 GL error 0x501 
Info: Invalid vertex attribute index. Wanted index: 4294967295. Max index: 16 

Je suis essayé en quelque sorte de le résoudre en utilisant glBufferData et glBufferSubData, mais n'ont pas de succès. Peut-être qu'il y a un exemple ou wiki comment le faire correctement?

+0

'ArrayList' n'est pas un thread-safe de sorte que vous devriez faire synchronisé essayer Collections.synchronizedList() – Mohamed

Répondre

0

C'est l'erreur ConcurrentModification, ce qui signifie que vous essayez d'accéder au pipeline de rendu à partir d'un thread différent de celui sur lequel OpenGL est rendu.

Cela devrait être la façon de le faire:

glSurfaceView.queueEvent(new Runnable() { 
        @Override 
        public void run() { 
         mGLRenderer.AddFigure(1f, 1f, 1f); 
        } 
       }); 
+0

Ca y est! Merci! – ashchuk