Android:与OpenGL渲染器线程同步

时间:2011-12-09 04:49:59

标签: android multithreading opengl-es

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

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

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

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

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:4)

我建议不要扩展GLSurfaceView,而是在线程之间进行异步通信。有关几个例子,请参阅我的answer here

基本上,您通过对它的方法调用在GLSurfaceView.Renderer的实现中对任务进行排队。然后,当GL线程在Renderer中调用onDraw()方法时,您将执行这些排队的任务。完成任务后,使用Handler

向其他线程指示任务已完成

也不要睡觉UI线程。如果UI线程进入睡眠状态,Android操作系统没有得到响应并误解应用程序已崩溃,(陷入无限循环或某事)并将向用户发出强制关闭对话