MOGRE 1.8.1 + WPF (C#) - обратный буфер недействителен, когда пользователь меняет разрешение или компьютер переходит в спящий режим

Я работаю с MOGRE 1.8.1 для встраивания 3D-моделей в приложение WPF. Я столкнулся с проблемой, когда приложение зависает, когда пользователь меняет разрешение или его компьютер переходит в спящий режим. Я считаю, что это потому, что система рендеринга пытается нарисовать поверхность, к которой у нее больше нет доступа.

Я не совсем уверен, что делать; Я пытался использовать метод dispose, чтобы убить MOGRE и перезагрузить его позже (перехватывая событие windows), но столкнулся с утечкой памяти. Метод pause рендеринга, включенный в библиотеку MOGRE, тоже не работает. У кого-нибудь есть идеи как обойти эту проблему?

Заметки

Спасибо за помощь.

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;
    }
Другие вопросы по тегам