1

我正在使用 MOGRE 1.8.1 在 WPF 应用程序中嵌入 3D 模型。我遇到了 当用户更改分辨率或他们的计算机进入睡眠状态时应用程序崩溃的问题。我相信这是因为渲染系统正在尝试绘制到它无法再访问的表面。

我不确定该怎么做;我尝试使用 dispose 方法杀死 MOGRE 并稍后重新启动它(通过捕获 windows 事件),但遇到了内存泄漏。MOGRE 库中包含的暂停渲染方法似乎也不起作用。有没有人对如何规避这个问题有任何想法?

笔记

谢谢您的帮助。

4

1 回答 1

1

当设备丢失时会发生此错误,因此您必须在函数 RenderFrame() 中添加控件

//WallPaper, CTRL + ALT + DEL, etc
        if (this.isDeviceLost)
        {
            //Recreate the texture render
            ReInitRenderTarget();

            //Restore device lost
            _renderWindow._beginUpdate();
            _renderWindow._endUpdate();

            _reloadRenderTargetTime = -1;
            this.isDeviceLost = false;
        }

这是我的 ReInitRenderTarget() 函数

protected void ReInitRenderTarget()
    {
        DetachRenderTarget(true, false);
        DisposeRenderTarget();

        _texture = TextureManager.Singleton.CreateManual(
            "OgreImageSource RenderTarget",
            ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME,
            TextureType.TEX_TYPE_2D,
            (uint)ViewportSize.Width, (uint)ViewportSize.Height,
            0, Mogre.PixelFormat.PF_R8G8B8A8,
            (int)TextureUsage.TU_RENDERTARGET);//, null, false, 8);

        _renTarget = _texture.GetBuffer().GetRenderTarget();

        _reloadRenderTargetTime = 0;

        int viewportCount = ViewportDefinitions.Length;
        viewports = new Viewport[viewportCount];

        for (int i = 0; i < viewportCount; i++)
        {
            Viewport viewport;
            ViewportDefinition vd = ViewportDefinitions[i];
            viewport = _renTarget.AddViewport(vd.Camera, zIndexCounter++, vd.Left, vd.Top, vd.Width, vd.Height);
            viewport.BackgroundColour = vd.BackgroundColour;
            viewports[i] = viewport;
        }

        var ev = ViewportsChanged;
        if (ev != null) ev();

        viewportDefinitionsChanged = false;
    }
于 2017-06-22T22:20:01.263 回答