java - 有没有人有在渲染器类之外绘制对象的示例?

标签 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 */
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(),但是我看到的示例仅对渲染器中的现有类进行更改、旋转或转换的队列事件进行排队,我自己无法弄清楚如何绘制在另一个线程中实例化的东西(最终动态地通过散列映射是理想的)但我需要一个示例来说明如何做,或者如果可能的话?

-谢谢

最佳答案

在您的应用程序中的其他线程与您的 GL 线程/渲染器之间进行通信的更好方法是让您的渲染器实例提交您的 Activity :

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/主线程,您可以使用 Handler

是的,做一个 hashmap 而不是一个 vector 应该相当容易,这样你就不会加载重复的方 block

As for confusion...

关于java - 有没有人有在渲染器类之外绘制对象的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8532408/

相关文章:

java - 读取 XML 值以填充 Java 变量

android - 如何在android中发送smack中的音频文件

java - 如果 Java 线程已经被该线程占用,为什么还必须重新进入该锁?

java - 如何使用 Swing 运行后台任务?

C++ this作为线程参数,变量不可用

java - 如何在 Java 中比较字符串?

java - 服务器关闭时 Webstart 应用程序非常慢

java - Java 中的 String.format() 和十六进制数字

android - 如何激活 Android 本地化文件编辑器

android - 在 Android 选项卡中显示具有模糊效果的 Activity