汇集 PBO 和纹理?

Posted

技术标签:

【中文标题】汇集 PBO 和纹理?【英文标题】:Pooling PBOs and textures? 【发布时间】:2012-02-06 20:19:30 【问题描述】:

我有一个应用程序,它使用 Opengl 和像素缓冲区对象执行大量 GPGPU 来传输和处理数据。

目前我使用这些资源的池,基本上我有一个池用于我的应用程序使用的每个缓冲区尺寸和使用情况。当资源的使用完成时,它会返回到其各自的池中以供重用。但是,我开始怀疑这是否有任何内容,因为我需要在重新使用之前“孤立” PBO,以免干扰正在进行的转移。

我的问题是池化 PBO 和纹理等资源是否有任何优点,或者在需要时直接从 OpenGL 分配是否只是一个好处?

这是我正在做的一个例子。反之亦然。

std::shared_ptr<pbo> create_pbo(int size, bool write)

    auto pool = pbo_pools[write][size];
    std::shared_ptr<pbo> buffer;
    if(!pool->try_pop(buffer))  
        buffer = ogl_thread_.invoke([=]return new pbo(size, write);); 

    return spl::shared_ptr<pbo>(buffer.get(), [=](pbo*) mutable
    
        ogl_thread_.begin_invoke([=]() mutable
               
            if(write)
                buffer->map();
            else // read
                buffer->unmap();

            pool->push(buffer);
        ); 
    );

【问题讨论】:

投票资源是什么意思? pooling resources such as PBOs and textures - 你做得怎么样?是第 1 条评论中的一个类型(poll->pool) @VJovic:用示例更新问题。 @ronag:题外话,但我在看什么?这就像我见过的没有 C++。 C++11? @genpfault:是的,C++11。调用、begin_invoke 方法只是来自一个在线程实例上包装函数执行的类。 【参考方案1】:

我开始三思而后行,因为我需要在重新使用之前“孤立”PBO,以免干扰正在进行的转移。

不,您不必这样做。这就是 PBO 的优点:您可以向其中提交新数据,而对 glTex(Sub)Image 的调用可能仍在读取它们,而不会损坏读取操作。

【讨论】:

据此,opengl.org/wiki/Buffer_Object_Streaming,您应该在向 PBO 写入新数据之前孤立它们。 @ronag:调用glBufferDate(..., data),定义为等价于glBufferData(..., 0), glBufferSubDate(..., data)。孤立的想法是准备一个新的缓冲区,如果你想使用 glMapBuffer 映射缓冲区而不强制 OpenGL 同步。但是,如果您只是想上传新数据,则没有必要。 “glMapBuffer 不强制 OpenGL 同步”,是我想要做的...不向 PBO 写入内容就没有新数据要上传? 刚刚意识到你的问题取决于你所说的上传/下载的方向,无论哪种方式我都在做。 @ronag:通常的方法是使用多个缓冲区对象,即在一个上进行数据传输,而另一个在 OpenGL 内部使用。

以上是关于汇集 PBO 和纹理?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 纹理映射内存泄漏

像素缓冲区对象PBO 记录

OpenGL RGB DXT1压缩纹理mipmap上传

使用多个像素缓冲区对象更新视频纹理时出现卡顿

使用 OpenGL API 播放 BIK 视频

OpenGL ES之深入解析PBOUBO与TBO的功能和使用