【问题标题】:Pixel-path performance warning: Pixel transfer is synchronized with 3D rendering像素路径性能警告:像素传输与 3D 渲染同步
【发布时间】:2018-03-19 17:04:35
【问题描述】:

我正在将图像数据上传到 GL 纹理asynchronously

在调试输出中,我在渲染过程中收到以下警告:

来源:OpenGL,类型:Other,id:131185,严重性:Notification
消息:缓冲区详细信息:缓冲区对象 1(绑定到 GL_PIXEL_UNPACK_BUFFER_ARB,使用提示为 GL_DYNAMIC_DRAW) 已 在系统堆内存中映射 WRITE_ONLY(快速)。来源:OpenGL,类型: 性能,id:131154,严重性:中等消息:像素路径 性能警告:像素传输与 3D 渲染同步。

在我的案例中,我看不到 PBO 的任何错误用法或任何错误。所以问题是,这些警告是否可以安全丢弃,或者我实际上做错了。

我的那部分代码:

    //start copuying pixels into PBO from RAM:
    mPBOs[mCurrentPBO].Bind(GL_PIXEL_UNPACK_BUFFER);

    const uint32_t buffSize = pipe->GetBufferSize();
    GLubyte* ptr = (GLubyte*)mPBOs[mCurrentPBO].MapRange(0, buffSize, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
    if (ptr)
    {
        memcpy(ptr, pipe->GetBuffer(), buffSize);
        mPBOs[mCurrentPBO].Unmap();
    }

  //copy pixels from another already full PBO(except of first frame into texture //
    mPBOs[1 - mCurrentPBO].Bind(GL_PIXEL_UNPACK_BUFFER);
     //mCopyTex is bound to mCopyFBO as attachment
    glTextureSubImage2D(mCopyTex->GetHandle(), 0, 0, 0, mClientSize.x, mClientSize.y,
            GL_RGBA, GL_UNSIGNED_BYTE, 0);

    mCurrentPBO = 1 - mCurrentPBO;

然后我只是将结果 blit 到默认帧缓冲区。不渲染几何图形或类似的东西。

  glBlitNamedFramebuffer(
            mCopyFBO,
            0,//default FBO id
            0,
            0,
            mViewportSize.x,
            mViewportSize.y,
            0,
            0,
            mViewportSize.x,
            mViewportSize.y,
            GL_COLOR_BUFFER_BIT,
            GL_LINEAR);

在 NVIDIA GTX 960 卡上运行。

【问题讨论】:

  • “问题更接近”先生,请赐教我的问题有什么问题?

标签: c++ opengl


【解决方案1】:

此性能警告是特定于 nividia 的,它旨在作为一个提示,告诉您不会使用单独的硬件传输队列,这不足为奇,因为您使用的是单线程、单 GL 上下文模型,渲染(至少是你的 blit)和传输都在哪里进行。

有关 nvidia 如何处理此问题的一些详细信息,请参阅 this nvidia presentation。第 22 页也解释了这个特定的警告。请注意,此警告确实 not 意味着您的传输不是异步的。它仍然与 CPU 线程完全异步。它只会在 GPU 上同步处理,相对于同一命令队列中的渲染命令,并且您没有使用异步复制引擎,它可以独立于单独命令队列中的渲染命令进行这些复制。

在我的案例中,我看不到 PBO 的任何错误用法或任何错误。所以问题是,这些警告是否可以安全丢弃,或者我实际上做错了。

您的 PBO 使用没有问题。

尚不清楚您的特定应用程序是否甚至可以从使用更精细的单独传输队列方案中受益。

【讨论】:

  • 因此,如果我要在单独的线程上在共享 GL 上下文中运行上传,那将是最佳选择,我不会收到这样的警告,对吧?
  • 这个特定的应用程序不会受益于在单独的线程中上传。这里没有大量的图像数据要加载。我只是从系统内存中的某个源获取帧并将其推送到纹理进行渲染。但是,了解该警告的性质是件好事。
猜你喜欢
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2016-10-28
  • 1970-01-01
  • 2018-03-23
  • 2021-06-02
相关资源
最近更新 更多