2017-07-10 1 views
0

私の単純なGLES20アプリでは、描画するために実行時にいくつかのオブジェクトを追加しようとしています。私は正方形のArrayListの持っている私のレンダラクラスで :ここGLES20を使用して実行時に描画するオブジェクトを追加する方法は?

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

は私Squareクラスです。

は、onSurfaceCreatedに作成するとうまく描画されます。

しかし、私が実際にやりたいことは何ですか。実行時にボタンをクリックしてに四角形を描くことにより、をmSquaresに追加する必要があります。

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

私は私の活動のボタンをクリックすることで、このメソッドを呼び出しています:

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

しかし、それは常にこの例外をスロー:私のレンダラクラスで

私はAddFigure()メソッドを作成し

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

および

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 

どういうわけかglBufferDataglBufferSubDataを使って修正しようとしましたが、成功しません。 おそらく、それを行うには例やwikiがありますか?

+0

'ArrayList'が、それはそれだCollections.synchronizedList() – Mohamed

答えて

0

これはConcurrentModificationエラーです。つまり、OpenGLがレンダリングされるスレッドとは別のスレッドからレンダリングパイプラインにアクセスしようとしています。

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

を試し同期あなたが作る必要がありますので、スレッドセーフではありません。

これはそれを行うための方法でなければなりません!ありがとう! – ashchuk

関連する問題