Android:与OpenGL渲染线程同步



我使用OpenGL ES在Android应用程序中执行绘图。

我想写一个从UI线程调用的函数,它会调用渲染器线程,让它读取并返回图像给调用者。

我正在考虑使用Future,以便UI线程在渲染线程写入图像数据时休眠(该操作非常快,因此用户不会觉得应用程序变得无响应)。

但是我对如何将Future提交给渲染器线程感到茫然。我找到的所有示例都创建了自己的线程,然后将未来提交给这些线程。关于GLSurfaceView的文档提到"queueEvent()方法用于在UI线程和呈现线程之间安全地通信。如果你喜欢,你可以使用一些其他的Java跨线程通信技术,比如在Renderer类本身上的同步方法,"所以看起来使用Future而不是调用queueEvent()是可能的,但我不知道如何做到这一点。

因此,我没有测试它,所以可能无法工作:

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.

我建议不要扩展GLSurfaceView,而是在线程之间进行异步通信。请看我在这里给出的几个例子

在GLSurfaceView的实现中,你基本上是在队列任务。渲染器通过方法调用它。然后,当GL线程调用Renderer中的onDraw()方法时,执行那些排队的任务。当完成任务时,使用Handler

指示其他线程任务已经完成。

也不要让UI线程休眠。如果UI线程进入睡眠状态,android操作系统就得不到任何响应,会误以为应用程序已经崩溃(陷入无限循环或其他),并弹出强制关闭对话框给用户

最新更新