“2D内存管理”的高效算法

时间:2015-05-20 22:05:33

标签: algorithm memory-management 2d

我正在开发一个基于OpenGL的应用程序,它需要能够动态生成一组不断变化的纹理。

从我最初的阅读开始,听起来对于我需要绘制的每个图像使用单独的纹理作为绑定纹理的操作是非常糟糕的,因此可以用于渲染非常慢。 / p>

首选的方法是将许多这些所需的图像组合成一个更大的图像并将该纹理绑定一次并仅绘制其中的摘录(精灵)。

不幸的是,我的图片可能会有不同的大小,并且会以某种不可预测的方式变得需要和过时。

所以,我需要的是一种内存管理器,它在我的纹理中维护一个已使用和自由区域的列表,并可以为新的/过时的图像分配/处理区域。

这基本上是每个程序需要做的内存管理(在堆中分配和处理不同大小的变量),除了它是一个2D问题,因为我在一个大正方形而不是短“行”中分配矩形更长的一个。

我试图解决的问题是否有名称,是否有(或多种)标准/最佳实践方法?

(快速澄清:我不是在寻找处理引用计数的方法,以及找出不再使用哪些图像的方法。我正在寻找一种方法来在补丁中保留新的矩形 - 现有的和间隙的工作,最小化(消除?)任何重新安排其他矩形。)

更新:

我想出了一个不同方法的想法,但决定将其发布为new question进行调查。

1 个答案:

答案 0 :(得分:1)

这看起来类似于2D bin-packing问题 - 这是NP-hard,但你可以使用断头台切割启发式(请参阅here获取解释,here获取某些源代码)近似解决了多项式时间内的问题。

标准2D bin-packing算法不包括对象的删除。我的建议是维护一个自由空间的搜索树,并使用first-fit或best-fit将新对象分配给自由空间,然后当所有内容变得足够碎片时(例如,当你无法找到足够的可用空间来分配时)一个对象)你重新运行完整的bin-packing算法。如果完全重新排列对象是非常不受欢迎的,那么您可以将屏幕空间拆分为四分之一(或十六分之一或其他),并且仅在具有最多可用空间的屏幕部分上重新运行bin-packing算法。