2011-12-09 10 views
5

OpenGL ESを使用してAndroidアプリで描画を実行しています。Android:OpenGLレンダラスレッドとの同期

レンダラスレッドを呼び出すUIスレッドから呼び出され、呼び出し元にそのイメージを読み込んで返す関数を記述したいと考えています。

Futureを使用して、レンダラースレッドが画像データを書き込んでいる間にUIスレッドがスリープするように考えていました(その操作は非常に高速で、ユーザーはアプリが応答しなくなったような気がしません)。

しかし、私は将来をレンダラスレッドに提出する方法については迷っています。私が見つけたすべての例は、独自のスレッドを作成し、これらのスレッドに未来を提出します。 GLSurfaceViewのドキュメントでは、「queueEvent()メソッドは、UIスレッドとレンダリングスレッド間で安全に通信するために使用されます。必要に応じて、Rendererクラス自体の同期メソッドなど、他のJavaクロスス​​レッド通信技術を使用できます"だから、queueEvent()を呼び出す代わりに未来を使用するように見えますが、どうすればいいのかわかりません。

答えて

7

汝これ、私はそれをテストしていないので、動作しない可能性があります:

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

私はGLSurfaceViewを拡張し、その代わりに、スレッド間の非同期通信を行っていないことをお勧めしたいです。いくつかの例についてはanswer hereを参照してください。

本来、GLSurfaceView.Rendererの実装では、メソッド呼び出しによってタスクをキューに入れます。次に、GLスレッドがレンダラーでonDraw()メソッドを呼び出すと、それらのキューに入れられたタスクが実行されます。タスクが終了したら、タスクが完了したことを他のスレッドに指示してください。Handler

また、UIスレッドをスリープ状態にしないでください。 UIスレッドがスリープ状態になると、アンドロイドOSは応答を得ず、アプリケーションがクラッシュしたことを誤って解釈し(無限ループや何かに巻き込まれて)、ユーザーに強制クローズダイアログが表示されます

関連する問題