我一直在研究创建自己的分配器方法(该方法将支持诸如内存池和配置文件之类的东西),但是,当我继续进行研究时,我一直在寻找在游戏开发中如何实现的方法。
我可以使用哪种内存分配技术,为什么它是一种好的技术?
我一直在研究创建自己的分配器方法(该方法将支持诸如内存池和配置文件之类的东西),但是,当我继续进行研究时,我一直在寻找在游戏开发中如何实现的方法。
我可以使用哪种内存分配技术,为什么它是一种好的技术?
Answers:
游戏引擎体系结构具有有关此主题的一些信息。基本要求是您需要进行一些分析以了解每个级别/帧/等的内存要求。就像,但是作者提到了几种已经看过几次的模式:
作者提到要注意的最大事情是内存碎片。如果您正在为例如PC开发的计算机上有一个可以依靠的某种内存分页备份,那么这个问题就不那么严重了,但是在诸如控制台这样的固定内存环境中,存在“内存不足”的风险。尝试分配大对象时,因为您的内存被碎片化,只有很小的连续块可用。为此,他建议上述基于堆栈的分配器还包括一种定期对其内容进行碎片整理的方法。
有关与此相关的实际代码的更多信息,我强烈建议Christian Gyrling的文章“我们内存不足了吗?” ,它主要从分析内存使用模式的角度介绍了用于自定义分配器的技术,但这也适用于设计用于内存管理的自定义解决方案。
从我所看到的(但还没有完成)来看,每个游戏都倾向于从框架,游戏引擎,先前版本(2010-> 2011)中继承分配机制,或者倾向于为其专门编写一套新游戏。结构(当数据结构可重用且具有固定大小或多种类型和可变大小时)。
同样,在同一项目中,声音文件/组件的分配器与关卡和其他游戏对象的分配器不同。在其他项目中,分配器仅从该库管理的组件的外部库继承。
优化实际上取决于您的需求。但是通常分配是在进入游戏场景之前完成的,然后重新使用内存。某些游戏无需提供自定义分配器就可以逃脱。但是对于预算有处理器,内存和数据资源的动作游戏,您不能承受因大分配而浪费的处理时间,也不能浪费内存来分散内存和其他问题。
经常犯的错误是编写自己的分配器,以便您可以更好地控制每个系统使用了多少内存,并且对正在发生的事情有更多的了解。一种更好的方法是使用内存分析器。有很多内存分析器,我的分析器MemPro就是一个例子。这是一种跟踪所有内存使用情况的完全非侵入式方法,您可以使用调用堆栈通配符过滤器将其自动分解为子系统。理想情况下,最好使您的内存分配和内存跟踪完全分开,它们有完全不同的要求。
随意将内存划分为多个池通常可能是有害的,因为每个池都有开销。您最终可能会使用比实际需要更多的内存。为了减少浪费,最好将所有内容放在一起,然后整个系统共享松弛。
使用自定义分配器的唯一原因是CPU性能(主要是为了提高缓存的一致性)并限制碎片。粒子系统就是一个很好的例子。您希望所有粒子在内存中都是连续的,并且您不希望使用大量短期分配来增加主内存。分区的另一个很好的例子是脚本语言。
如果您需要通用malloc替换的示例,可以查看我的VMem分配器。它已在许多AAA游戏中使用。它具有限制碎片化并保持较低内存占用的技术,这对于主机游戏至关重要。在高线程争用情况下,它也非常快。我的网站上有关于这些技术的大量文档。