【问题标题】:xna fires OutOfMemoryException on 1.3GBxna 在 1.3GB 上触发 OutOfMemoryException
【发布时间】:2016-12-30 21:37:03
【问题描述】:

所以我目前正在XNA工作室开发一款游戏,遇到了以下问题:

每当我使用超过 1.3GB 的 RAM 时,就会触发 OutOfMemoryException,在谷歌搜索后我发现这是因为 .NET 4.5 框架中的一条规则限制了 32 位应用程序的内存使用。可以通过使用 Visual Studio 附带的 EditBin.exe 更改编译后的 bin 来解决。

因为 XNA 已停止支持 64 位编译,所以我想知道当我为最终用户编译它时,是否有办法保证内存限制增加到 4GB(甚至 3GB)?有人告诉我有 /LARGEADDRESSAWARE 选项,但我真的不知道如何在 XNA 项目中使用它们。

【问题讨论】:

  • 也许切换到 Monogame(其 API 几乎相同)可能会提供解决方案?
  • 刚刚用 Monogame 尝试过,它给了我同样的问题

标签: c# .net visual-studio xna xna-4.0


【解决方案1】:

使用 MonoGame 并将目标平台设置为 x64,假设是 64 位操作系统(即使在 2016 年,也就是 Windows 7 发布七年后,这应该是给定的)。这将解决问题。

Windows XP(32 位)每个进程的最大内存分配为 2GB(SP2 配置将此扩展到 3.5GB),或者在 36 位 PAE 处理器和启用的操作系统上,如 Windows Server 2003+(32 位),在 64 GB 可用空间中,每个进程最多 4 GB。

您会认为虚拟内存(页面文件)会允许更多内存,但单个 32 位进程只能访问 4GB 的内存空间(由于不可移动的操作系统空间,所以上面定义的更少)。页面文件允许多个进程访问自己的 4GB 空间,无论天气是否有足够的物理内存来保存所有数据。

在 64 位操作系统上,32 位进程可以访问完整的 4 GB 地址空间。我通过在 2015 年将 2^31 字节的解决方案存储到 XNA 中的河内塔来证明了这一点,这个限制在 2017 年使用 64 位 MonoGame 扩展到了 2^62(运行了两个小时)。

在 64 位 Windows 环境中使用的最大内存大小可能有类似的限制,我们不知道,但截至 2019 年初,英特尔处理器支持的最大物理内存量为 8*1536 MB,大约 12TB(请注意,虽然这是一个统一的地址空间,但每个处理器负责自己的 1536 MB 内存,使用 QPI/UPI 访问自己处理器之外的内存)。此限制远未接近 16 艾字节的理论最大值(实际上是 7.5e-7)。

【讨论】:

  • 我无法理解反对意见,也许有人锁定了 32 架构?
猜你喜欢
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
相关资源
最近更新 更多