gpt4 book ai didi

c++ - 一个大池还是几个特定类型的池?

转载 作者:IT王子 更新时间:2023-10-28 23:35:17 26 4
gpt4 key购买 nike

我正在开发一款需要高性能的视频游戏,因此我试图设置一个良好的内存策略或游戏的特定部分,即游戏“模型”的部分,即游戏表示。

我有一个包含整个游戏表示的对象,里面有不同的管理器,以保持表示一致,遵循游戏规则。每个游戏实体当前都是由特定类型的工厂生成的,所以我有几个工厂可以让我根据需要隔离和更改这些实体的内存管理。

现在,我正在这两种选择之间进行选择:

  1. 每种类型都有一个内存池:这将允许真正快速的分配/释放和最小的碎片,因为对象池已经知道分配对象的大小。困扰我的一件事是有几个这样的独立池,也许会使其他解决方案更有效......
  2. 拥有一个由一个游戏表示的所有工厂共享的大内存池:(使用带有一些适配器功能的 boost::pool 之类的东西)这样我就可以将所有游戏对象的内存分配在一起并且可以为我已经知道总大小的游戏分配一个位(并非总是如此)。我不确定它是否比 A 更好,因为池内可能存在碎片,因为在同一个池中会有不同大小的对象,但对于内存分析和其他问题修复来说,它看起来更容易。

现在,我在 A 方面有一些真实世界的经验,所以我对 B 没有经验,并且想就这些解决方案获得一些建议,以用于长期项目。 哪个解决方案似乎更适合长期项目,为什么?(注意:在这种情况下确实需要一个池,因为游戏模型也用于游戏编辑,所以会有很多分配/解除分配小 object )。

编辑澄清:我正在使用 C++ if(尚不清楚)

最佳答案

正确答案是针对您的问题领域的。但在我工作的问题领域中,第一个通常是我们选择的。

我做实时或接近实时的代码。主要是音频编辑和播放。在该代码中,我们通常无法在播放引擎中从堆中分配内存。大多数时候 malloc 返回的速度足够快,但有时却没有。这有时很重要。

所以我们的解决方案是为某些对象设置特定的池,而对其他所有对象使用通用池。特定的池预先分配了一定数量的元素,并以链表(实际上是队列)的形式实现,因此分配和释放永远不会超过几次指针更新和进入和离开临界区的成本。

作为异常情况的后备方案;当有人需要从特殊池中分配并且它是空的 - 我们将分配一大块通用内存(几个对象)并将其添加到特殊池中。一旦分配成为特殊池的一部分,在应用退出或启动新项目之前,它永远不会返回到通用池。

正确选择特殊池的初始大小和最大大小是调整应用程序的重要部分。

关于c++ - 一个大池还是几个特定类型的池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1964722/

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