【问题标题】:passing instructions from UI thread to Rendering thread (GLSurfaceView)将指令从 UI 线程传递到渲染线程 (GLSurfaceView)
【发布时间】:2013-01-09 11:17:34
【问题描述】:

设置:如图所示,带有 GLSurfaceView 和 Button 的 RelativeLayout..

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

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

【问题讨论】:

    标签: android glsurfaceview


    【解决方案1】:

    你应该看看 queueEvent!这是将信息从 UI Thread 传递到渲染器 Thread 的一种非常方便的方式:

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

    【讨论】:

      【解决方案2】:

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

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

      活动类

      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 类中包含足够的局部变量来定义它们。

      希望我的回答对你有帮助,如果有任何问题,请告诉我。

      提姆

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 2014-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多