游戏开发中使用的内存分配模式


20

我一直在研究创建自己的分配器方法(该方法将支持诸如内存池和配置文件之类的东西),但是,当我继续进行研究时,我一直在寻找在游戏开发中如何实现的方法。

我可以使用哪种内存分配技术,为什么它是一种好的技术?


1
您真的需要吗?这只是团队可以实施的最复杂的事情之一。
Ali1S232'3

4
这是我感兴趣的领域,所以我想学习并实施它
chadb 2012年

我必须说,这个主题真的很有趣...在某些情况下,这可能意味着分配,但就您平均的PC游戏而言,我宁愿担心实际的游戏...
rioki 2012年

您是否研究了现代标准库malloc和free或new和delete的源代码?我问,是因为这似乎可以提供一个非常有用的基础,可以根据此基础将任何替代分配策略与算法或实践进行比较。似乎它也可以为您提供一些真正的见识。
Louis Langholtz

Answers:


25

游戏引擎体系结构具有有关此主题的一些信息。基本要求是您需要进行一些分析以了解每个级别/帧/等的内存要求。就像,但是作者提到了几种已经看过几次的模式:

  • 基于堆栈的分配器: 这些分配器一次分配很大一部分内存,然后响应游戏中其他位置的请求在该内存块中分配指针。这对于避免内存分配所需的上下文切换很有用,并且还因为您可以使用自己的技术来强制连续性或SIMD操作的特定对齐方式。一些引擎还使用双端堆栈,其中一种是从顶部加载资源,而另一种是从底部加载资源。也许从顶部开始是LSR(加载并保持驻留,整个游戏将需要这种东西),而从底部开始则是每个级别的数据。
  • 单帧内存或双缓冲帧内存: 用于在一两个帧周期内发生的操作的内存。这很有用,因为您不必重置/重新分配每个帧,而是可以通过重置用于跟踪内存的指针(该指针一直指向该块的开头)来吹散最后一帧的数据。
  • 对象池: 许多相同大小的对象(例如粒子,敌人,弹丸)的内存块。这些功能很有用,因为您可以通过在池中找到第一个未使用的段来轻松实现连续性。它们还使迭代变得容易,因为每个对象都与最后一个对象有一个已知的偏移量。

作者提到要注意的最大事情是内存碎片。如果您正在为例如PC开发的计算机上有一个可以依靠的某种内存分页备份,那么这个问题就不那么严重了,但是在诸如控制台这样的固定内存环境中,存在“内存不足”的风险。尝试分配大对象时,因为您的内存被碎片化,只有很小的连续块可用。为此,他建议上述基于堆栈的分配器还包括一种定期对其内容进行碎片整理的方法。

有关与此相关的实际代码的更多信息,我强烈建议Christian Gyrling的文章“我们内存不足了吗?” ,它主要从分析内存使用模式的角度介绍了用于自定义分配器的技术,但这也适用于设计用于内存管理的自定义解决方案。


1

从我所看到的(但还没有完成)来看,每个游戏都倾向于从框架,游戏引擎,先前版本(2010-> 2011)中继承分配机制,或者倾向于为其专门编写一套新游戏。结构(当数据结构可重用且具有固定大小或多种类型和可变大小时)。

同样,在同一项目中,声音文件/组件的分配器与关卡和其他游戏对象的分配器不同。在其他项目中,分配器仅从该库管理的组件的外部库继承。

优化实际上取决于您的需求。但是通常分配是在进入游戏场景之前完成的,然后重新使用内存。某些游戏无需提供自定义分配器就可以逃脱。但是对于预算有处理器,内存和数据资源的动作游戏,您不能承受因大分配而浪费的处理时间,也不能浪费内存来分散内存和其他问题。

关于示例,您应该首先看看OGRE 3D游戏引擎,它具有一些配置内存分配器的选项。


0

经常犯的错误是编写自己的分配器,以便您可以更好地控制每个系统使用了多少内存,并且对正在发生的事情有更多的了解。一种更好的方法是使用内存分析器。有很多内存分析器,我的分析器MemPro就是一个例子。这是一种跟踪所有内存使用情况的完全非侵入式方法,您可以使用调用堆栈通配符过滤器将其自动分解为子系统。理想情况下,最好使您的内存分配和内存跟踪完全分开,它们有完全不同的要求。

随意将内存划分为多个池通常可能是有害的,因为每个池都有开销。您最终可能会使用比实际需要更多的内存。为了减少浪费,最好将所有内容放在一起,然后整个系统共享松弛。

使用自定义分配器的唯一原因是CPU性能(主要是为了提高缓存的一致性)并限制碎片。粒子系统就是一个很好的例子。您希望所有粒子在内存中都是连续的,并且您不希望使用大量短期分配来增加主内存。分区的另一个很好的例子是脚本语言。

如果您需要通用malloc替换的示例,可以查看我的VMem分配器。它已在许多AAA游戏中使用。它具有限制碎片化并保持较低内存占用的技术,这对于主机游戏至关重要。在高线程争用情况下,它也非常快。我的网站上有关于这些技术的大量文档。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.