2011-12-16 4 views
2

私はアンドロイドのためのOpenGL ESを学んでいますが、私はちょっと混乱しています。私は、オブジェクトの描画を見てきた例ではレンダラークラスの外にオブジェクトを描画する例はありますか?

、VIAのは、正方形がレンダラで行われるとしましょう:これは素晴らしいとすべてですが、これを行うための私の全体のポイントは、にある

public class MainRender implements GLSurfaceView.Renderer { 

private Square  square;  // the square 
private Context  context; 

/** Constructor to set the handed over context */ 
public MainRender(Context context) { 
    this.context = context; 

    // initialise the square 
    this.square = new Square(); 
} 


    @Override 
    public void onDrawFrame(GL10 gl) { 
     // clear Screen and Depth Buffer 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
       square.draw(gl); 
        } 

ほとんどのロジックをレンダリングプロセスと区別します。

レンダラークラス内でSquareインスタンスをインスタンス化するのは難しいです。 スレッド間でやりとりする安全な方法は、queueEvent()を使用することですが、レンダラーの既存のクラスを変更、回転、または変換するキューイベントのみを見てきましたが、私は理解できません私自身、別のスレッドでインスタンス化されたものを描画する方法(結局、ハッシュマップを使って動的に最適化するのが理想的ですが)を行う方法の例が必要です。

-Thanks

答えて

1

あなたのアプリとあなたのGLのスレッド/レンダラで他のスレッド間で通信するためのより良い方法は、あなたの活動に手にあなたのレンダラのインスタンスを維持することです:

public class stackoverflowTest extends Activity { 

GLSurfaceView glSurface; 
MyRenderer myRenderer; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    glSurface = (GLSurfaceView)findViewById(R.id.glSurfaceView1); 

    myRenderer = new MyRenderer();   

    glSurface.setRenderer(myRenderer); 

    Square mySquare = new Square(); 
    myRenderer.addSquareToScene(mySquare); 

} 
} 

、その後、他の方向に戻って通信するためにあなたのレンダラ

public class MyRenderer implements Renderer { 

private Vector<Square> scene; 
private Vector<Square> bufferedSquaresToAddToScene 

@Override 
public void onDrawFrame(GL10 gl) { 
    while(bufferedSquaresToAddToScene.size()>0){ 
     scene.add(bufferedSquaresToAddToScene.remove(0)); 
    } 

    for(int i = 0;i<scene.size();i++){ 
     scene.get(i).draw(gl); 
    } 

} 

public void addSquareToScene(Square square){ 
    bufferedSquaresToAddToScene.add(square); 
} 
} 

では、非UIスレッドの少し難しいですが、UI /メインスレッドにあなただけのを使用することができます

そして、あなたが重複正方形に

As for confusion...

をロードしないようにはい、代わりに、ベクターのハッシュマップを行うにはかなり簡単にする必要があります
関連する問題