2011-12-09 12 views
5

Estoy usando OpenGL ES para realizar dibujos en una aplicación de Android.Android: Sincronización con el hilo de renderizador OpenGL

Quiero escribir una función llamada desde el subproceso UI que llamaría al subproceso del representador y lo haría leer y devolver la imagen al llamador.

Estaba pensando en usar un Future para que el subproceso de la interfaz de usuario durmiera mientras el subproceso del renderer escribe los datos de imagen (esa operación es muy rápida, por lo que el usuario no sentiría que la aplicación no respondía).

Pero no sé cómo enviar el futuro al hilo del renderizador. Todos los ejemplos que encontré crean sus propios hilos y luego envían el futuro a estos hilos. La documentación sobre GLSurfaceView menciona "El método queueEvent() se usa para comunicar de forma segura entre el subproceso de UI y el subproceso de representación. Si lo prefiere, puede utilizar otra técnica de comunicación cruzada de Java, como métodos sincronizados en la clase Renderer misma " así que parece que usar un futuro en lugar de llamar al queueEvent() es posible, pero no tengo idea de cómo hacerlo.

Respuesta

7

Thy esto, no he probado, así que no podría funcionar:

FutureTask<YourReturnObject> futureTask = new FutureTask<YourReturnObject>(new Callable<YourReturnObject>() { 
    @Override 
    public YourReturnObject call() throws Exception { 
     //your gl stuff here 
     return // result 
    } 
}); 
glSurfaceView.queueEvent(futureTask); 
YourReturnObject result=futureTask.get(); // should block until gl thread is done. 
4

me gustaría sugerir que no se extiende GLSurfaceView, pero en vez de hacer la comunicación asíncrona entre hilos. Vea mi answer here para un par de ejemplos

Esencialmente usted pone tareas en cola en su implementación de GLSurfaceView.Renderer a través de métodos de llamadas a la misma. Luego, cuando el hilo GL llama a su método onDraw() en el Procesador, ejecuta esas tareas en cola. Al finalizar las tareas, indique a los otros hilos que las tareas se completaron usando Handler

También no duerma el hilo de UI nunca. Si el subproceso de la interfaz de usuario se pone a dormir, el sistema operativo Android no obtiene respuesta y malinterpreta que la aplicación se ha bloqueado, (está atrapado en un bucle infinito o algo así) y arrojará un diálogo Cerrar fuerza al usuario

Cuestiones relacionadas