一个大型泳池或几个特定类型的泳池?

Kla*_*aim 9 c++ memory pool

我正在研究一款需要高性能的视频游戏,所以我试图设置一个好的记忆策略或游戏的特定部分,即游戏"模型",即游戏表现.我有一个包含整个游戏表示的对象,里面有不同的管理器,以保持表示符合游戏规则.每个游戏实体当前都是由特定类型的工厂生成的,所以我有几个工厂允许我按照自己的意愿隔离和更改这些实体的内存管理.

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

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

现在,我对A有了一些现实世界的经验,所以我对B没有经验,并希望对这些解决方案有一些建议,对于一个长寿项目.对于长寿项目来说,哪种解决方案似乎更好?为什么?(注意:在这种情况下,确实需要一个池,因为游戏模型也用于游戏编辑,所以会有很多小对象的分配/释放).

编辑澄清:如果(我还不清楚)我正在使用C++

Joh*_*ler 9

正确答案特定于您的问题域.但在我工作的问题域中,第一个通常是我们选择的域.

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

因此,我们的解决方案是为特定对象设置特定池,并将通用池用于其他所有对象.特定池具有预先分配的一定数量的元素,并且实现为链接列表(实际上是队列),因此分配和释放永远不会超过几个指针更新以及进入和离开关键部分的成本.

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

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