【问题标题】:Does multiple thread help if Fragment Shader takes too long to execute?如果 Fragment Shader 执行时间过长,多线程是否有帮助?
【发布时间】:2016-03-15 18:04:44
【问题描述】:

目前我正在使用 OpenGL ES 在 Android 上开发图像处理算法。输入图像的尺寸非常大(如 4000x6000 像素),算法需要多次迭代。在我的实现中,我在片段着色器中编写了代码并设置了一个 FBO 纹理来实现渲染到纹理的东西。

但是,它需要将近 2~3 秒。在此期间,同样使用 OpenGL ES 渲染的 UI 层冻结。用户无法与之交互。在优化着色器代码之前,我想知道GPU是否可以同时运行两个着色器。

那么,我怎样才能让我的 UI 保持活跃?我是否需要多个上下文,一个上下文渲染 UI,另一个执行渲染到纹理着色器?

【问题讨论】:

  • 一些 GPU 可以同时执行不同的着色器,但依赖它是个坏主意。在您的情况下,将工作与着色器分开并在帧上只执行一步会更好。例如,您可以将输入图像分成几块,一次只处理一个。

标签: android multithreading opengl-es


【解决方案1】:

是的,这是一个非常标准的程序。您需要将该进程放入一个单独的线程中,该线程也可以创建新的上下文。

要从第二个上下文接收数据(例如纹理)并在主上下文中使用它,您需要查看共享上下文。如果您不创建共享上下文,则应该无法将数据从一个上下文传输到另一个上下文。

您将打开的附加线程的数量取决于您正在做什么,但通常只有一个后台线程是最安全的。所以基本上你会想要创建一个将在另一个线程中运行的工作人员,你可以为它分配任务。不过,您需要注意如何处理来自工作人员的回调,多线程很容易产生问题。

【讨论】:

    猜你喜欢
    • 2012-11-25
    • 2015-02-04
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多