c# - xna 在 1.3GB 上触发 OutOfMemoryException

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

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

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

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

最佳答案

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

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 年通过在 XNA 中存储一个 2^31 字节的汉诺塔解决方案证明了这一点,这个限制在 2017 年使用 64 位 MonoGame 扩展到 2^62(运行需要两个小时)。

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

关于c# - xna 在 1.3GB 上触发 OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39111650/

相关文章:

c# - 派生类可以隐藏访问器-下面的代码有什么问题

c# - 我在命令提示符中输入了一个问号,而不是货币符号

.net - F#类型提供程序的构建速度非常慢

.net - 如何调试用.net编写的Fiddler扩展?

c# - 如何摆脱特定的警告消息

visual-studio - 如何让单元测试在 Visual Studio 中连续运行

c# - ObservableCollection 方法 add() 阻塞

javascript - 使用属性将多个文件绑定(bind)到数组

.net - 将保存在磁盘上的eml文件加载到.net Mail.Message对象中

c# - 在自定义 Web 控件中显示可能的属性值