【问题标题】:PC XNA Game converted to Xbox 360 - Huge Performance IssuesPC XNA 游戏转换为 Xbox 360 - 巨大的性能问题
【发布时间】:2012-08-12 03:08:16
【问题描述】:

所以我想将我的 PC 游戏转换为在 Xbox 360 上运行。它在 PC 上运行得非常好,配备 Intel Core 2 Quad @ 2.40Ghz 和 Radeon 4850 512MB。

我将它移植到 Xbox 上,但马上,列表导入的不变性和继承存在一些问题,所以我简单地使用了称为 .Cast() 的 LINQ 方法。

如果这种方法开销很大,请告诉我,因为由于某种原因我无法在 360 上部署性能分析,很可能是因为它在 360 上播放。

然后另一个问题来了,这是一个很好的 System.OutOfMemoryException。我的天空盒纹理是 4096x4096,因此将它们减少一半可以消除该错误。不过奇怪的是,它们只有 3MB x 6,所以它不应该使用那么多可用的 512MB。

因此,当所有这些问题都解决后,每 2 秒 1 帧的效果就很好了。然后它会在玩 1 分钟后崩溃,不管这意味着什么“代码 4”。

它就像一个幻灯片。以下是来自 PC 游戏的一些性能分析图像。他们还不错。

CPU:http://i.imgur.com/JYx7Z.png RAM:http://i.imgur.com/C29KN.png 72% = 150MB 请注意。

我希望这里的任何人都对这个问题有一些经验。坦率地说,我全神贯注。

【问题讨论】:

    标签: c# xna xbox360


    【解决方案1】:

    性能问题的根本原因几乎可以肯定是因为您在游戏运行时分配内存(启动后,在Draw/Update 循环期间)。

    在 Windows 上这很好。 Windows 上的垃圾收集器是分代的(只会在可能的情况下清理新对象)并且速度极快。它也很聪明地选择了何时运行。

    另一方面,Xbox 360 上的垃圾收集器完全是垃圾。它为每分配 1MB 的内存运行。它在运行时检查整个托管堆。而且开机很慢。

    所以答案是永远不要在游戏处于运行状态时分配内存。

    关于here 有一篇很好的博客文章。 (它还描述了从不分配内存的替代方案——即降低堆复杂性——这真的很难实现,我不推荐它。)

    • 您将不得不删除 LINQ 之类的东西,因为它创建的查询对象是堆对象,它经常需要的委托也是如此。请改用简单的循环。
    • 如果您在绘制/更新中分配自己的引用类型,则必须尽可能转换为使用值类型或添加对象池。
    • 创建 string 对象是另一个常见的内存分配来源 - 相反,您可以重复使用 StringBuilder 并直接渲染它。
    • 将事物(尤其是:数字)转换为字符串,即使是StringBuilder 也会分配内存。您需要编写/找到无需分配的替代方案。 My answer to this similar question 有一个 int

    诊断内存分配位置的最佳方法是在 Windows 上使用 CLR Profiler 运行游戏。这将告诉您分配内存的位置和时间。只需优化直到不分配。

    (或者直到您可靠地为每个级别/地图/房间/任何东西分配少于 1MB 的空间,并在适合卡顿的时间执行手动 GC - 例如静态加载屏幕或淡入淡出。 )

    代码 4 是未处理的异常。您需要安装一个输出消息的顶级异常处理程序,或在调试器中运行您的游戏,以确定原因。

    最后:这可能是您的纹理的 压缩 大小(使用 PNG 或 JPEG 或类似文件)。如果您的纹理未压缩,4096 × 4096 × 6 × 4 字节 = 384MB。这是巨大的——难怪你的内存用完了。您可以使用 DXT1 压缩它们并将它们缩小 6 倍(instructionswiki)。你也可以降低他们的分辨率。你还需要底面吗?

    【讨论】:

    • 非常感谢,经过大量搜索后,我找到了与您类似的答案,当我运行我的 CLR 配置文件时,我发现我每帧分配了大约 60MB...不好。这是因为我将游戏中的所有可碰撞对象都添加到列表中,然后每帧将它们放入 Collision Thread 中。我可以把它做成一个静态列表,它只是一个参考,我可能会这样做,但我认为可能会发生碰撞延迟。但我想这是唯一的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多