Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有人有在渲染器类之外绘制对象的示例吗?_Java_Android_Multithreading_Opengl Es_Rendering - Fatal编程技术网

Java 有人有在渲染器类之外绘制对象的示例吗?

Java 有人有在渲染器类之外绘制对象的示例吗?,java,android,multithreading,opengl-es,rendering,Java,Android,Multithreading,Opengl Es,Rendering,我正在学习android的OpenGL ES,但我有点困惑 在示例中,我看到了对象的绘制,假设通过以下方式在渲染器中绘制正方形: public class MainRender implements GLSurfaceView.Renderer { private Square square; // the square private Context context; /** Constructor to set the handed over context *

我正在学习android的OpenGL ES,但我有点困惑

在示例中,我看到了对象的绘制,假设通过以下方式在渲染器中绘制正方形:

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); 
                    }
这很好,但我这样做的全部目的是将大部分逻辑从渲染过程中分离出来

因此,我不习惯在renderer类中实例化Square实例。 我知道线程间通信的一种安全方式是使用queueEvent(),但我所看到的示例只是改变、旋转或转换渲染器中现有类的队列事件,我自己无法弄清楚如何在另一个线程中绘制实例化的对象(最终通过hashmap动态绘制是理想的)但我需要一个例子来说明怎么做,或者如果可能的话


-谢谢

在应用程序中的其他线程和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);
}
}
公共类MyRenderer实现渲染器{
专用矢量场景;
专用向量bufferedSquaresToAddToScene
@凌驾
公共框架(GL10 gl){
而(bufferedSquaresToAddToScene.size()>0){
添加(bufferedSquaresToAddToScene.remove(0));
}
对于(int i=0;i