为什么创建一个GraphicsDevice导致实例化时出现“意外错误”?

时间:2013-01-30 00:27:04

标签: c# xna

我正在尝试在Winforms MDI应用程序中嵌入一个简单的XNA应用程序,我似乎遇到了问题。我跟随http://xbox.create.msdn.com/en-US/education/catalog/sample/winforms_series_1的例子,我不确定我做错了什么。

在我的MDI父级中,我通过以下方式实例化渲染表单:

    private void MainForm_Load(object sender, EventArgs e)
    {
        var render = new RenderForm();
        render.MdiParent = this;
        render.Show();
    }

我的渲染表单的代码是:

public class RenderForm : Form
{
    private XnaRenderer _renderer;

    protected override void OnCreateControl()
    {
        if (!DesignMode)
            _renderer = new XnaRenderer(Handle, ClientSize.Width, ClientSize.Height);

        base.OnCreateControl();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        _renderer.RenderScene(null);
    }
}

因此,在创建表单时,它会尝试创建我的XnaRenderer类的实例。 ClientSize.Width为284,ClientSize.Height为261,Handle看起来有效。构造函数的代码是:

    public XnaRenderer(IntPtr windowHandle, int width, int height)
    {
        _graphicsService = new GraphicsDeviceService(windowHandle, width, height);

        SetViewport(width, height);
    }

GraphicsDeviceService类与示例代码中的类基本相同,但它不是单例。构造函数的代码是:

    public GraphicsDeviceService(IntPtr windowHandle, int width, int height)
    {
        _presentationParams = new PresentationParameters
        {
            BackBufferFormat = SurfaceFormat.Color,
            BackBufferHeight = Math.Max(height, 1),
            BackBufferWidth = Math.Max(width, 1),
            DepthStencilFormat = DepthFormat.Depth24,
            DeviceWindowHandle = windowHandle,
            PresentationInterval = PresentInterval.Immediate
        };

        _graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.Reach,
                                             _presentationParams);
    }

但是,当实例化GraphicsDevice对象时,我得到以下InvalidOperationException

  

发生了意外错误。

没有更多的异常消息,也没有内部异常,如果没有很多XNA知识,这很难调试。

有人看到我做错了吗?

2 个答案:

答案 0 :(得分:3)

想出来了!

在我的演示参数构建中,我需要添加IsFullScreen = false

如果它能给出一个好的异常消息,那就更容易理解了

答案 1 :(得分:1)

尝试使用OnHandleCreated代替OnCreateControl

protected override void OnHandleCreated()
{
    if (!DesignMode)
        _renderer = new XnaRenderer(Handle, ClientSize.Width, ClientSize.Height);

    base.OnHandleCreated ();
}

如果不起作用,请尝试使用HiDef个人资料而不是Reach个人资料。

否则,我没有看到任何错误。