我可以(ab)将VirtualAlloc用于游戏中的每个类似矢量的容器吗?



>想象我正在制作一个游戏

  • 我知道它将在64位系统上运行,在64位操作系统上运行。
  • 游戏的内存预算是固定的2(或 4)千兆字节

这是否意味着在该过程的 64 位Virtual Address Space中,我将剩下 32 位可以随心所欲地玩?

例如,我可以为游戏中的每个容器(容器=类似std::vector)使用VirtualAllocMEM_RESERVE2 Gibibytes的内存吗?

随着新元素的添加,根据需要MEM_COMMIT新的pages(大约 64K)。当容器死亡时,内存会相应地释放VirtualFree

出于好奇:

  1. 在技术上可行吗?

  2. 是否有任何性能原因不这样做?


编辑:澄清:如果游戏中有10000个容器,则将保留2GiB * 10000内存 - 但提交的内存将小于2(或4)GiB。

这 10000 个容器也可以增加到 2^16 个容器(或者地址空间允许的数量)。

是的,它可以工作。

当我玩过它1时,我发现它仍然最好从相当大的内存块(例如,兆字节)开始将内存提交到它,然后遵循大小的几何级数。调用VirtualAlloc(显然)需要切换到内核模式,因此如果可以提供帮助,您希望避免经常这样做,这有足够的开销。


1.虽然那是很久以前的事了 - Windows NT 4或Win2K的时间框架,所以事情可能已经发生了变化。

最新更新