使用XNA,Multi-Sampling和HD获取OOM错误

时间:2009-04-02 19:57:58

标签: xna

我在XNA游戏中实现了MultiSampling,它在我的桌面上运行良好。当我在XBox360上以HighDefinition模式运行游戏时,我得到一个OOM异常。如果我没有启用MultiSampling,游戏运行正常,但模型没有消除锯齿并且看起来很糟糕。

以下代码似乎是罪魁祸首。

    void _graphics_PreparingDeviceSettings(object sender, PreparingDeviceSettingsEventArgs e)
    {
        e.GraphicsDeviceInformation.PresentationParameters.MultiSampleType = MultiSampleType.TwoSamples;
    }        

    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        graphics.PreferMultiSampling = true;
        graphics.PreferredBackBufferHeight = 720;
        graphics.PreferredBackBufferWidth = 1280;
        graphics.PreparingDeviceSettings += _graphics_PreparingDeviceSettings;
        graphics.ApplyChanges();

        base.Initialize();
    }

会导致OOM异常。

我的主要目标是使模型看起来像样(消除锯齿),MultiSampling似乎是正确的方法。我对此很新,所以如果有人能指出我正确的方向,我会很感激。

2 个答案:

答案 0 :(得分:2)

我认为如果您只是将代码从初始化移动到构造函数中并删除对graphics.ApplyChanges(...)的调用,那么您的问题就会消失。

Venesectrix发布的文章指出,对于XBOX360,ApplyChanges(...)是一种禁忌。

因此,您需要在构建设备之前进行所有这些GraphicsDevice设置。这是通过在构造函数中设置它来完成的。在这种情况下,无需调用ApplyChanges()。

当调用Initalize()时,设备已经构建完毕。调用ApplyChanges会导致重置并再次触发事件以准备设备设置。如果我没有弄错的话,关于XNA的设备重置在360上并不真正支持并且会禁止。

希望这有帮助,请告诉我。

-Jeff B。

答案 1 :(得分:1)

我建议您在XNA论坛上查看此thread,尤其是第一篇文章和帖子here。如果没有看到您正在处理的其余代码,我无法确定这是您遇到的问题,因此您必须仔细查看。如帖子所示,启用多重采样可能不会直接导致问题。