У кого-нибудь есть пример отрисовки объекта вне класса рендерера? - PullRequest
2 голосов
/ 16 декабря 2011

Я изучаю OpenGL ES для Android, но я немного запутался.

В примерах, которые я видел, рисование объекта, скажем, квадрат делается в рендере через:

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 (), но в примерах, которые я видел, только события очереди изменяют, вращают или переводят существующий класс в рендерер, и я не могу понять сам Как нарисовать что-то, созданное в другом потоке (в конечном счете, динамически через hashmap было бы идеально), но мне нужен пример того, как это сделать вообще, или если это возможно?

-Спасибо

1 Ответ

1 голос
/ 16 декабря 2011

Лучший способ связи между другими потоками в вашем приложении и вашим потоком / рендерером 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);
}
}

Для обратной связи в другом направлении это немного сложнее для потоков, не относящихся к пользовательскому интерфейсу, но для пользовательского интерфейса / основного потока вы можете просто использовать Обработчик

И да, должно быть довольно легко создать хеш-карту вместо вектора, чтобы не загружать дублирующиеся квадраты

Что касается путаницы ...

...