This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DRA750:能否将 OpenGL-es 运算放入两个线程中?

Guru**** 2935310 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/642328/dra750-can-i-put-opengl-es-operations-into-two-threads

器件型号:DRA750

大家好、我们正在将3D 环视应用整合到我们的系统中。 但是、我们的系统也必须执行其他操作(与 CAN 相关的任务)。 我的同事告诉我、显示屏幕的线程 A 太忙。 他建议我们不要在线程 A 中运行我们的3D 算法

我们的3D 算法为每个帧花费30ms、但线程 A 中两个帧的操作间隔超过80ms

他建议我将与渲染相关的代码移动到另一个线程 B、并将 Draw 函数保留在线程 A 中

因此、我按如下方式更改了代码:

初始化时

线程 A 调用以下函数来创建纹理 T 并将图像缓冲区绑定到每个纹理。

 glTextImage2D (纹理、0、gL_alpha、alpha_gd.cols、alpha_gd.rows、 0、gL_alpha、gL_unsigned_byte、alpha_gd.data);  

每个帧

第一个线程 B 调用以下函数将新图像绑定到纹理 T、并对这些纹理执行一些操作以获得我们需要的结果。

glTextSubImage2D (GL_t纹 理_2D、0、0、0、宽度、 高度、GL_RGB、GL_unsigned_byte、缓冲区);

然后线程 A 调用以下函数将渲染结果绘制到 scrren 中。

glDrawElements (GL_triangles、6、GL_unsigned_short、0);  

解决方案的工作原理。 两帧的操作间隔对于每帧约为40ms。

但超过10分钟后、屏幕看起来会损坏、显示随机图像。

我的问题是"能否将 OpenGL-es 运算放入两个线程中以及如何执行?"

此致、

苏梅森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已将您的问题转交给 OpenGLES 专家。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、您好!

    您能帮助我再次向 OpenGLES 专家提出我的问题吗?

    此致、
    苏梅森
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    只是为了更新您:由于图形团队目前在接下来的3-4周内忙于处理一些高优先级任务、他们的响应速度可能非常慢。 在此之后、我们将尝试确定 E2E 论坛的优先级。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、您好!

    图形团队现在是否可用? 我们仍然存在上述问题。

    此致、
    苏梅森
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    苏梅森

    要回答您的问题"是否可以将 OpenGL-es 运算放入两个线程中以及如何执行?"、是的、您可以将 OpenGL ES 运算放入两个线程中。 OpenGL ES 和 EGL 是开放标准、您可以在线找到有关如何实现它的文档。

    此致、
    Subhajit
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Subhajit:

    感谢您的回复。 我们找到了一些有关这方面的文章。 方法如下。

    在主线程中

    EGLint contextAttrs[]={

        EGL_context_client_version、2、

        EGL_NONE

    };

     

    log_info ("创建上下文");

    if (!(m_context = eglCreateContext (m_Display、m_Config、0、contextAttrs))))

       log_error ("eglCreateContext () returned error %d"、eglGetError());

       返回 false;

    另一个线程中

    EGLint contextAttrs[]=

           EGL_context_client_version、2、

           EGL_NONE

    };

     

    如果(m_context = 0)

           log_error ("m_context was n't initialized for some reason");

     

    //为此线程创建共享上下文

    m_LocalThreadContext = eglCreateContext (m_Display、m_Config、m_context、contextAttrs);

     

    您认为这种方法会起作用吗?

    另一个问题是、如果方法正常、如何在 QT 环境中获得 m_Display 和 m_Config。

    谢谢。

    此致、

    苏梅森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好梅森、
    您是否能够使多线程 OpenGL 应用程序正常工作?

    Ramprasad
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好梅森、
    我希望根据上述建议、您能够获得适合您的多线程开放 gl。
    如有任何疑问/问题、请告知我们。

    Ramprasad
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    现在问题得到解决。  

    感谢你的帮助

    苏梅森

    最恰当的考虑