将指令从UI线程传递到渲染线程(GLSurfaceView)

时间:2013-01-25 13:26:15

标签: android glsurfaceview

设置:具有GLSurfaceView和按钮的RelativeLayout,如图所示..

enter image description here

问题:让我说我有其他三角模型(图片中的那个是初始模型)...我希望在点击按钮时循环更改模型。由于按钮位于UI线程上并且glSurfaceView在单独的线程上运行,因此我并不完全知道如何将信息/指令传递给它。我知道Android中有一个名为Handler的东西,在这种情况下可能很有用......但我需要一些帮助......

修改:如果Handler是正确的方式,我需要知道如何将Looper添加到该处理程序...文档说明在开头添加looper.prepare() run()方法..但glSurfaceView隐式创建线程,导致没有run()方法直接可用..

2 个答案:

答案 0 :(得分:4)

我认为没有必要使用处理程序来解决此问题,但您可能需要调整组织课程的方式。

以下是可能解决您问题的组织结构示例:

活动类

public class MainActivity extends Activity {

    private int modelNumber = 0;
    private ArrayList<Model> models = new ArrayList<Model>();
    private YourRendererClass renderer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...

        // Setup GLSurfaceView
        GLSurfaceView surface = new GLSurfaceView(this);
        setContentView(surface);

        renderer = new YourRendererClass();
        surface.setRenderer(renderer);

        // Set up models
        models.add(new Model(x, y, size etc..));
        models.add(new Model(x, y, size etc..));
        models.add(new Model(x, y, size etc..));
        etc.

        // Display first model
        renderer.setCurrentModel(models.get(modelNumber));

        ...
    }

    // Called by the button press:
    // Use android:onClick="onClick"
    // in your layout xml file within button
    public void onClick(View view){
        // Make it loop round
        modelNumber++;
        if(modelNumber>=models.size()){
            modelNumber=0;
        }

        // Display current model
        renderer.setCurrentModel(models.get(modelNumber));

    }
}

渲染器类

public class YourRendererClass implements Renderer {

    private Model currentModel;

    @Override
    public void onDrawFrame(GL10 gl) {

        // ** Your existing set-up code **//

        // Draw model
        if (currentModel!=null){
            currentModel.draw(gl);
        }

    }

    public void setCurrentModel(Model model){
        currentModel = model;
    }

}

模型类

public class Model {
    // Holds model information
    private int size;
    private int x;
    private int y;
    // etc...

    public model(int x, int y, int size etc...){
        this.x=x;
        this.y=y;
        this.size=size;
        // etc....
    }

    public void draw(GL10 gl) {
        // ** Draw model based on model information fields above **
    }
}

上面的代码未经测试,因为我无法访问您的绘图代码,但如果正确实施,结构应该可以正常工作。我已经尝试明确说明您必须插入自己的代码才能使其正常工作。特别是我不确定是什么定义了每个不同的模型,所以你需要在Model类中包含足够的局部变量来定义它们。

我希望我的回答有所帮助,如果您有任何问题,请与我联系。

答案 1 :(得分:1)

你应该看看queueEvent!这是将信息从UI线程传递到渲染器线程的非常方便的方法:

queueEvent(new Runnable(){
    @Override
    public void run() {
        mRenderer.method();
}});