内存池算法

3
我希望在OpenGL中处理VBO时能够使用更智能的算法。
目前,我将每个模型存储在4MB的VBO中。如果模型大于4MB,则会单独存储。这些对象被存储在一起,以减少绑定的数量。
我遇到的问题是如何清理未使用的VBO,这些VBO只被稀疏地使用。如果有任何关于如何更好地管理这些内存池的资源,将不胜感激。

1
我假设你已经尝试过创建和销毁所需大小的VBO,并让驱动程序处理内存管理了吗?(注意:4MB不等于4096000字节) - Ben Voigt
@daniel:我并不是建议VBOs只能在单个帧中存活,而是建议每个模型都有自己的VBO,而不是将它们打包在一起。这样你就不会有这些“最不常用”的VBO了。这到底是什么样的应用程序,会频繁卸载模型呢? - Ben Voigt
以上所使用的系统可能存在一些潜在缺陷,我避免使用单独的VBO是为了减少绑定次数,特别是对于静态数据。至于为什么是4MB,那是ATI/Nvidia推荐的VBO大小。应用程序不一定会频繁卸载,但这只是我注意到可能会成为问题的一件事情。 - deceleratedcaviar
1
@Daniel:如果ATI和nVidia推荐4MB的VBO,那么这也是推荐的批处理大小。我认为他们并不建议绑定4MB的数据,然后逐个渲染这4MB的数据块。如果您有几个不同的模型需要交错渲染,那么将它们加载到单个VBO中可能是一个合理的想法,但这表明它们密切相关且不会独立卸载。将不相关的纹理打包到VBO中可能会使性能变差,而不是更好。绑定VBO不会消耗内存吞吐量,从CPU读取或写入VBO会。 - Ben Voigt
@Daniel,我认为你误解了VBO的目的。它们并不是为了最小化OpenGL帖子。我没有看到任何应用程序使用固定大小的VBO进行内存池管理,因为它们是为了让驱动程序为您执行此操作,而Ben的建议是常见的方法。实际上,你的帖子(以Lol开头的那个)让我差点笑出声来。 - Christian Rau
显示剩余3条评论
2个回答

1

VBO(顶点缓冲对象)不像常规内存,不需要任何复杂的“内存管理”。 您为每个不同的网格分配自己的适当大小的VBO即可完成。 任何试图比驱动程序更聪明的尝试都会导致性能不佳。

此外,试图使您的VBO尽可能大是没有好处的。 实际上,在我的经验中,约0.5k到5k个顶点的适度大小的VBO效果最佳。


模式大小是什么意思? - deceleratedcaviar
打赌这是“模型尺寸”的笔误! :) - Nicolas Lefebvre
实际上我想写的是“谦虚”(注意有个“t”)。 - datenwolf

1

我最初也像你一样。我用大约100行代码实现了一个简单的空闲列表,以便可以重复使用已释放的VBO段。这显著减少了VBO重新分配,这些重新分配会导致帧卡顿。我使用了最佳适配算法进行分配,因为我有许多网格恰好具有相同数量的顶点和面。


你能详细说明一下你的解决方案吗? - deceleratedcaviar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接