目前,我正在使用OpenGL ES在Android上开发图像处理算法。输入图像的大小非常大(如4000x6000像素),算法需要多次迭代。在我的实现中,我在片段着色器中编写了代码,并设置了一个FBO纹理来表示渲染到纹理的东西。
然而,它需要将近2~3秒。在此期间,使用OpenGL ES渲染的UI层也会冻结。用户无法与之交互。在优化着色器代码之前,我想知道GPU是否可以同时运行两个着色器。
那么,我如何保持我的UI活跃?我是否需要多个上下文,一个上下文呈现UI,另一个上下文执行渲染到纹理着色器?
答案 0 :(得分:0)
是的,这是一个非常标准的程序。您需要将该过程放入一个单独的线程中,这也可以创建一个新的上下文。
要从第二个上下文接收数据(例如纹理)并在主上下文中使用它,您需要查看共享上下文。如果您不创建共享上下文,则无法将数据从一个上下文传输到另一个上下文。
您将打开的其他线程的数量取决于您正在做什么,但通常最安全的是只有一个后台线程。所以基本上你想创建一个将在另一个线程中运行的worker,你可以为它分配任务。您需要注意如何处理来自工作者的回调,但多线程很容易产生问题。