我有一个应用程序,它使用Opengl和Pixel Buffer Objects来传输和处理数据,因此执行了很多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);
        });
    });
}

最佳答案



不,您不必。关于PBO的好处是:您可以向其中提交新数据,而对glTex(Sub)Image的调用可能仍在从中读取,而不会破坏读取操作。

关于c++ - 合并PBO和纹理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9166680/

10-11 23:22