我对像GTA IV这样需要快速创建和删除许多对象的游戏所使用的内存管理类型很感兴趣。它们如何避免碎片化堆(heap)等问题?如果有人能指点我正确的方向,我将不胜感激。
我对像GTA IV这样需要快速创建和删除许多对象的游戏所使用的内存管理类型很感兴趣。它们如何避免碎片化堆(heap)等问题?如果有人能指点我正确的方向,我将不胜感激。
他们使用类似于内存池, 专用分配器和专用容器类的东西。
有两个非常好的malloc
多线程实现:
tcmalloc
:由Google开发jemalloc
:被Apache等公司使用以下是Facebook关于改进jemalloc的文章。它比当前最佳答案中Hoard内存分配器快5倍 :)
我认为由于它们的对象大多数是相同大小的,它们可以使用一些内部内存管理器,该管理器实际上不会释放内存,而是将其标记为可用,并在下次分配~size的块时返回它。
free()
的简单实现方式。 - Artelius很多游戏使用这里提到的一些内存分配器。dlmalloc是我们使用非常成功的一个(我们已经将其与Lua捆绑在一起)。您可以在这里获取dlmalloc的信息。
还有一件事我要提一下,不是所有的游戏都必须使用动态内存分配。我们使用内存池和静态内存区域来存储大部分的游戏数据。只有需要动态分配的系统(例如Lua和某些第三方库)才会这样做。我们在游戏代码中也没有使用STL,这有助于限制内存碎片的“伤害”。
dlmalloc
算法非常接近的分配器,并且已经进行了各种改进。只有在Windows和游戏机(不知道它们的库是什么样子)这些系统中,将dlmalloc
作为malloc
替代品可能有任何用途。 - R.. GitHub STOP HELPING ICE