gpt4 book ai didi

视频游戏中纹理流的 C++ 内存管理

转载 作者:IT老高 更新时间:2023-10-28 21:52:04 25 4
gpt4 key购买 nike

这是一个“难”的问题。我在网上没有发现任何有趣的东西。

我正在为我的公司开发内存管理模块。我们为下一代游戏机(Xbox 360、PS3 和 PC...我们将 PC 视为游戏机!)开发游戏。

我们 future 需要为我们的下一款游戏处理无法全部加载到主机内存中的大型游戏世界的纹理流传输(暂时不讨论 PC)。

我们将在开始时流式传输纹理的高分辨率 mipmap(大约是世界数据大小的 70%)。也许在未来我们还必须流式传输几何、更小的 mipmap、音频等。

我正在为这个问题开发一个内存管理器,专注于 X360(因为在 PS3 上我们可以使用主机内存和相关的自动碎片整理 GMM 分配器)。

我面临的问题如下:我们决定为纹理流式传输保留一个特定的内存区域(例如 64 兆字节),并且我们希望处理该区域中的所有分配和解除分配。我们在应用程序开始时分配了该区域,并且该区域在物理上保证是连续的(不仅仅是虚拟的,因为我们需要在那里存储纹理)。

我已经实现了一个自动碎片整理分配器,使用句柄而不是指针。时间不是问题,问题是内存碎片。在游戏中,我们不断加载和卸载流目标,因此我们希望使用我们的缓冲区的最大数量(64 兆字节)。

有了这个分配器,我们可以使用所有分配的空间,但是碎片整理程序在一个 Not Acceptable 时间内工作(有时是 60 毫秒,超过一帧!)而算法还不错......有太多不可避免的内存!

我正在寻找解决此问题的解决方案。我想至少找到一篇好论文,或验尸报告,或遇到与我相同问题的人。

现在我在两种策略之间进行选择:1) 将碎片整理例程移到专用线程上(适用于具有 6 个硬件线程的 X360,对只有一个硬件线程的 PS3 不利......并且不要告诉我使用 SPU!)与锁定区域的所有多线程问题,访问正在移动的区域,...2)找到碎片整理问题的“增量”解决方案:我们可以给每一帧一个碎片整理的时间预算(例如最多 1 毫秒),内存管理器将在每帧的预算中做它可以做的事情。

谁能告诉我他的经历?

最佳答案

我最近做了很多关于内存管理的研究,这是我在网上找到的最有用和最有用的文章。

http://www.ibm.com/developerworks/linux/library/l-memory/

根据该论文,您将获得的最佳和最快结果是将您的 64 MB 分成大小相等的 block 。 block 的大小将取决于您的对象大小。并一次分配或释放一个完整的 block 。这是

  1. 比增量垃圾回收更快。
  2. 更简单。
  3. 并在一定程度上解决了“过多的碎片化”问题。

阅读它,您会发现关于每个可能的解决方案以及每个解决方案的优缺点的优秀信息。

关于视频游戏中纹理流的 C++ 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/661862/

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