Qua*_*leA 14 c++ memory-management game-engine
我最近转换为C++用于游戏编程 - 我在处理C#中的内存管理和垃圾收集问题方面有很多经验,但对C++没有那么多.
我过去听过一些模糊的建议,以避免游戏过程中的分配和解除分配(即new和delete),并预先分配你可能需要的所有东西.但是,这比在游戏运行时(敌人,粒子等)根据需要分配和释放游戏对象要繁琐且在架构上更复杂.
我认为我读到的建议是指资源受限的平台 - 我的目标是主要针对PC开发,我认为经常变化的游戏状态数据最多只能达到几兆字节.其余的是我要预加载的纹理,声音资产等.
所以我的问题是:在与GB的内存电脑的世界,它是值得的头痛建立缜密的内存池,预分配,等我的比赛状态数据?或者这只是一些无可争议的"最佳实践"传统,在最大化有限平台时发展,现在又作为福音重复了?
如果我的2 MB游戏数据变得支离破碎并且现在已经超过4MB,我无法想象在1990年之后在PC上做出的任何事情 - 但我很想知道我是否遗漏了一些东西:).
Age*_*ien 21
new除非在游戏环境中有必要,否则避免打电话的主要原因是
动态分配
在我的工作中,我们开发了类似游戏的产品(虚拟手术),我们的大部分内存都是通过工厂或内存池预先分配和处理的.这样做是因为动态分配内存需要很长时间.系统必须在任何时候处理许多不同大小的存储器请求.这意味着需要进行大量工作,例如最大限度地减少碎片.如果你问系统内存,你将不得不等待它做这些事情.如果预先分配内存,则可以使用工厂或其他特定于块大小的内存管理器来缓解这些问题.
我可以从经验中告诉你,一个简单的错误,比如std::vector每帧从头开始分配一个相当大的错误,而不是重用预先分配的内存,可以将帧速率拖到阴沟中.
缓存未命中
另一个相关问题是缓存一致性.缓存未命中,迫使操作系统将新页面带入缓存,也非常昂贵.如果经常发生这种情况,你将拥有一款无法玩的游戏.但是,如果您预先分配大块内存,这对于改进缓存局部性有很大帮助,这使得缓存缺失很少.
故事的道德启示
因此,简而言之:如果你不管理自己的预先分配的内存,你可以期待您大量的计算时间,输给等待系统分配内存或处理高速缓存未命中.
| 归档时间: |
|
| 查看次数: |
4028 次 |
| 最近记录: |