gpt4 book ai didi

c++ - 为什么不在 C++ 游戏中频繁分配和释放内存?

转载 作者:IT老高 更新时间:2023-10-28 22:35:24 25 4
gpt4 key购买 nike

我最近转换为 C++ 进行游戏编程 - 我在处理 C# 中的内存管理和垃圾收集问题方面拥有丰富的经验,但在 C++ 方面没有那么多经验。

我过去听过一些含糊的建议,以避免在游戏过程中分配和解除分配(即 newdelete)并预先分配您可能需要的所有内容正面。但这比在游戏运行时根据需要分配和释放游戏对象(敌人、粒子等)要乏味且架构复杂得多。

我认为我读到的建议是指资源受限的平台 - 我的目标是主要为 PC 开发,我想会频繁更改的游戏状态数据最多约为几兆字节.其余的是我将要预加载的纹理、声音资源等。

所以我的问题是:在拥有千兆字节内存的 PC 世界中,是否值得为我的游戏状态数据设置精细的内存池、预分配等?或者这只是一些毫无疑问的“最佳实践”传统,在最大限度地利用有限平台时演变而来,现在被重复为福音?

如果我的 2 MB 游戏数据变得支离 splinter ,现在分布在 4MB 上,我无法想象这对 1990 年之后制造的 PC 有丝毫影响 - 但我很想知道我是否遗漏了什么 :)。

最佳答案

除非在游戏环境中必要,否则避免调用 new 的主要原因是

  1. 内存的动态分配确实非常昂贵。
  2. 缓存未命中对性能不利。

动态分配

在我的工作中,我们开发了一种类似游戏的产品(虚拟手术),我们的大部分内存都是通过工厂或内存池预先分配和处理的。这样做是因为动态分配内存需要很长时间。系统必须随时处理许多不同大小的内存请求。这意味着在流程中需要做很多工作,例如尽量减少碎片。如果您向系统请求内存,您将不得不等待它执行这些操作。如果您预先分配内存,您可以使用工厂或其他特定于 block 大小的内存管理器来缓解这些问题。

我可以根据经验告诉你,一个简单的错误,比如在每一帧都从头开始分配一个相当大的 std::vector,而不是重用预先分配的内存,可以将帧速率拖到排水沟。

缓存未命中

另一个相关问题是缓存一致性。缓存未命中(强制操作系统将新页面带入缓存)也非常昂贵。如果这种情况经常发生,您将拥有无法玩的游戏。但是,如果您预先分配大块内存,这可以大大改善缓存局部性,从而减少缓存未命中率。

故事的寓意

因此,简而言之:如果您不管理自己的预分配内存,您可能会浪费大量计算时间来等待系统分配内存或处理缓存未命中。

关于c++ - 为什么不在 C++ 游戏中频繁分配和释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15894122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com