2011-12-09 15 views
5

Sto usando OpenGL ES per eseguire il disegno in un'app Android.Android: sincronizzazione con il thread di rendering OpenGL

Desidero scrivere una funzione chiamata dal thread dell'interfaccia utente che chiamerebbe il thread di rendering e ottenerlo per leggere e restituire l'immagine al chiamante.

Stavo pensando di usare un Future in modo che il thread dell'interfaccia utente si interrompesse mentre il thread di rendering scrive i dati dell'immagine (l'operazione è molto veloce, quindi l'utente non si sentirebbe come se l'app non rispondesse).

Ma non riesco a dire come inviare il futuro al thread di rendering. Tutti gli esempi che ho trovato creano i loro thread e poi presentano il futuro a questi thread. La documentazione su GLSurfaceView menziona "Il metodo queueEvent() viene utilizzato per comunicare in modo sicuro tra il thread dell'interfaccia utente e il thread di rendering.Se si preferisce, è possibile utilizzare un'altra tecnica di comunicazione cross-thread Java, come i metodi sincronizzati sulla classe Renderer stessa ". quindi sembra che usare un Futuro invece di chiamare queueEvent() sia possibile, ma non ho idea di come farlo.

risposta

7

Thy questo, non ho la prova, quindi potrebbe non funzionare:

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

mi suggeriscono che non si estende GLSurfaceView, ma invece di fare comunicazione asincrona tra i thread. Vedere il mio answer here per un paio di esempi

In sostanza si mettono in coda le attività nell'implementazione di GLSurfaceView.Renderer tramite chiamate di metodo ad esso. Quindi, quando il thread GL chiama il metodo onDraw() nel Renderer, si eseguono quelle attività in coda. Al termine delle attività, indicare agli altri thread che le attività sono state completate utilizzando Handler

Inoltre, il thread dell'interfaccia utente non viene interrotto mai. Se il thread dell'interfaccia utente viene messo a riposo, il sistema operativo Android non riceve risposta e interpreta erroneamente l'arresto anomalo dell'applicazione (viene rilevato in un ciclo infinito o qualcosa del genere) e genera un dialogo di chiusura forzata all'utente

Problemi correlati