Android:与OpenGL渲染器线程同步

Poo*_*oks 6 multithreading android opengl-es

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

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

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

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

Dan*_*ete 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.
Run Code Online (Sandbox Code Playgroud)


Jam*_*ote 5

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

本质上,您可以通过对 GLSurfaceView.Renderer 的方法调用将任务排入您的 GLSurfaceView.Renderer 实现中。然后,当 GL 线程在渲染器中调用您的 onDraw() 方法时,您将执行那些排队的任务。任务完成时,使用Handler向其他线程表明任务已完成

也不要让 UI 线程休眠。如果 UI 线程进入睡眠状态,Android 操作系统将不会收到任何响应,并且会误解应用程序已崩溃(陷入无限循环或其他情况),并将向用户抛出强制关闭对话