像GTA IV这样的游戏如何避免堆内存碎片化?

19

我对像GTA IV这样需要快速创建和删除许多对象的游戏所使用的内存管理类型很感兴趣。它们如何避免碎片化堆(heap)等问题?如果有人能指点我正确的方向,我将不胜感激。


https://dev59.com/G1PTa4cB1Zd3GeqPimK7#4687324 - Lightness Races in Orbit
获取《现代C++设计》一书的副本,您将学习构建快速分配器的步骤。 - Edward Strange
6个回答

25

他们使用类似于内存池, 专用分配器和专用容器类的东西。

  1. Hoard Memory 分配器用于多线程程序。
  2. EA公司的 STL 版本。包含分配器、容器等。

内存池!是的,忘了那个术语 :) - Daniel

8
虽然本文没有具体涉及游戏,但它提供了一些人们通常在C和C++应用程序中使用的自定义内存分配器的概述,以尝试提高性能(并且是一个有点警示性的故事)。
Berger、Zorn和McKinley在2002年的OOPSLA发表了一篇重新考虑自定义内存分配的文章。这篇深入研究检查了8个使用自定义分配器的应用程序。令人惊讶的是,在这八个应用程序中,对于其中六个应用程序而言,最先进的通用分配器(Lea分配器)的性能与或优于自定义分配器。两个例外使用区域,可以提供更高的性能(提高了高达44%)。区域还减轻了程序员的负担并消除了内存泄漏的来源。然而,我们表明,程序员无法释放区域内的单个对象会导致内存消耗的显著增加。更糟糕的是,这种限制排除了将区域用于常见编程习惯,降低了它们的实用性。我们提出了一种通用的通用和基于区域的分配器的泛化,称为reaps。Reaps是区域和堆的组合,提供了全面的区域语义范围,并增加了单个对象删除功能。我们表明,我们的reaps实现提供了高性能,优于具有区域类似语义的其他分配器。然后,我们使用案例研究来演示reaps在实践中的空间优势和软件工程优势。我们的结果表明,需要快速区域的程序员应该使用reaps,并且大多数考虑自定义分配器的程序员应该使用Lea分配器。

有趣的是第一个答案会链接到你的博客 :) - Matthieu M.

7

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

  • tcmalloc:由Google开发
  • jemalloc:被Apache等公司使用

以下是Facebook关于改进jemalloc的文章。它比当前最佳答案中Hoard内存分配器快5倍 :)


那个结果非常异常 - 我希望能与Jason Evans合作,看看问题到底出在哪里。 - EmeryBerger
@EmeryBerger:这也让我感到惊讶,我真心希望你能找到答案。好的内存分配器是构建快速软件的第一块砖头 :) - Matthieu M.

6
快速创建和销毁大量对象并不一定意味着堆碎片。通常,如果这些对象大小相同,则一个对象释放的空间可以分配给下一个对象。
通常,为了优化,程序可能不会释放和删除对象的内存,而是将旧对象保留在池中,并简单地获取一个对象并覆盖其内容以创建“新”对象。

这么多人谈论碎片化,却不知道它的含义。 - R.. GitHub STOP HELPING ICE

2

我认为由于它们的对象大多数是相同大小的,它们可以使用一些内部内存管理器,该管理器实际上不会释放内存,而是将其标记为可用,并在下次分配~size的块时返回它。


这就是free()的简单实现方式。 - Artelius

1

很多游戏使用这里提到的一些内存分配器。dlmalloc是我们使用非常成功的一个(我们已经将其与Lua捆绑在一起)。您可以在这里获取dlmalloc的信息。

还有一件事我要提一下,不是所有的游戏都必须使用动态内存分配。我们使用内存池和静态内存区域来存储大部分的游戏数据。只有需要动态分配的系统(例如Lua和某些第三方库)才会这样做。我们在游戏代码中也没有使用STL,这有助于限制内存碎片的“伤害”。


请注意,任何真实的操作系统(即除了Windows之外的桌面/服务器/工作站操作系统)都使用与dlmalloc算法非常接近的分配器,并且已经进行了各种改进。只有在Windows和游戏机(不知道它们的库是什么样子)这些系统中,将dlmalloc作为malloc替代品可能有任何用途。 - R.. GitHub STOP HELPING ICE
这并不完全正确。基于Linux系统通常使用glibc分配器,它确实是基于dlmalloc。然而,Windows、FreeBSD、Solaris、AIX和Mac OS X都使用不同的内存分配器,其中没有一个是基于dlmalloc的。 - EmeryBerger
我想我应该澄清一下,我是在谈论非真实操作系统。撇开个人偏见不谈,我的答案确实是从Windows和控制台的角度出发的。 - Mark

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