Android: 与OpenGL渲染线程同步

8
我正在使用OpenGL ES在Android应用程序中进行绘画。
我想编写一个从UI线程调用的函数,该函数将调用渲染器线程并让它读取并返回图像给调用者。
我考虑使用Future使UI线程休眠,同时渲染器线程写入图像数据(该操作非常快,因此用户不会感到应用程序失去响应性)。
但是我不知道如何将Future提交给渲染器线程。我找到的所有示例都创建自己的线程,然后将Future提交给这些线程。有关GLSurfaceView的文档提到:“queueEvent()方法用于在UI线程和渲染线程之间安全地通信。如果您愿意,可以使用其他Java跨线程通信技术,例如Renderer类本身上的同步方法。”因此,使用Future代替调用queueEvent()可能是可行的,但我不知道如何做到这一点。
2个回答

8

尝试这个方法,我没有测试过,可能不起作用:

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.

5

我建议不要扩展GLSurfaceView,而是在线程之间进行异步通信。查看我的这里的答案以获取一些示例。

实际上,您可以通过调用GLSurfaceView.Renderer的方法,在其实现中排队任务。然后,当GL线程在Renderer中调用您的onDraw()方法时,您执行这些排队的任务。完成任务后,使用Handler指示其他线程任务已完成。

另外,永远不要使UI线程休眠。如果将UI线程置于休眠状态,则Android操作系统将无法从中获得响应,并会误认为应用程序已崩溃(被卡在无限循环中或其他情况),并向用户显示强制关闭对话框。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接