像GTA IV这样的游戏如何不会破坏堆?

时间:2011-01-14 03:12:22

标签: c++ memory-management heap

我对GTA IV等游戏可能会使用的内存管理类型感兴趣,因为它需要非常快速地创建和删除大量对象。如何避免碎片堆和其他东西。如果有人能指出我正确的方向,我真的很感激。

6 个答案:

答案 0 :(得分:23)

他们使用像memory pooling这样的东西,专门的分配器和专门的容器类。

  1. 多线程程序的Hoard Memory分配器。
  2. EA的STL版本。包含分配器,容器,

答案 1 :(得分:7)

虽然本文并未专门提及游戏,但它提供了一种很好的综合类型的自定义内存分配器,人们经常在C和C ++应用程序中使用它们以试图提高性能(这是一个警示故事)

Reconsidering custom memory allocation ,Berger,Zorn& McKinley,OOPSLA 2002

希望实现性能改进的程序员经常使用自定义内存分配器。这项深入研究检查了八个使用自定义分配器的应用程序。令人惊讶的是,对于其中六个应用程序,最先进的通用分配器(Lea分配器)的性能与自定义分配器相同或更好。这两个例外使用区域,提供更高的性能(改进高达44%)。区域还减少了程序员的负担并消除了内存泄漏的来源。但是,我们表明程序员无法在区域内释放单个对象会导致内存消耗大幅增加。更糟糕的是,这种限制排除了将区域用于常见的编程习语,从而降低了它们的用途。我们提出了我们称之为收益的通用和基于区域的分配器的概括。 Reaps是区域和堆的组合,提供了全方位的区域语义,并添加了单个对象删除。我们证明了我们的reaps实现提供了高性能,优于其他具有类似区域语义的分配器。然后,我们使用案例研究来证明实践中收益的空间优势和软件工程优势。我们的结果表明需要快速区域的程序员应该使用收益,并且大多数考虑自定义分配器的程序员应该使用Lea分配器。

答案 2 :(得分:6)

多线程实现有两个非常好的malloc实现:

  • tcmalloc:来自Google
  • jemalloc:由Apache使用(例如)

这是Facebook关于improving jemalloc的文章。在当前的最佳答案中,它比Hoard的内存分配器快5倍:)

答案 3 :(得分:5)

快速创建和销毁大量对象并不一定意味着堆碎片。通常,如果对象具有相同的大小,则可以为下一个释放一个空间。

通常,即使只是作为优化,程序也可能不会释放和删除对象的内存,而是将旧的内容保存在池中,只需抓取一个并覆盖内容即可创建“新”对象。

答案 4 :(得分:1)

我认为因为它们的对象大多数都是相同的大小,所以它们可以使用一些实际上没有释放内存的内部内存管理器,但是将其标记为可用,下次分配〜大小的块时它返回它。

答案 5 :(得分:1)

很多游戏都使用了这里提到的一些内存分配器。 dlmalloc是我们已经成功使用的一个(我们将它绑定到Lua)。您可以获取有关dlmalloc here的信息。

我要提到的另一件事是,并非所有游戏都必须使用动态内存分配。我们已经为我们的大多数游戏数据使用了mempools和静态内存区域。只有需要动态分配的系统才会这样做(Lua和一些第三方库)。我们所做的其他一切都来自静态缓冲区。我们在游戏代码中也没有使用STL,这有助于限制内存碎片的“损坏”。