我有一个应用程序,它使用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/