MOGRE 1.8.1 + WPF (C#) - обратный буфер недействителен, когда пользователь меняет разрешение или компьютер переходит в спящий режим
Я работаю с MOGRE 1.8.1 для встраивания 3D-моделей в приложение WPF. Я столкнулся с проблемой, когда приложение зависает, когда пользователь меняет разрешение или его компьютер переходит в спящий режим. Я считаю, что это потому, что система рендеринга пытается нарисовать поверхность, к которой у нее больше нет доступа.
Я не совсем уверен, что делать; Я пытался использовать метод dispose, чтобы убить MOGRE и перезагрузить его позже (перехватывая событие windows), но столкнулся с утечкой памяти. Метод pause рендеринга, включенный в библиотеку MOGRE, тоже не работает. У кого-нибудь есть идеи как обойти эту проблему?
Заметки
- Вы можете найти пример, который я запускаю здесь. Основное отличие состоит в том, что я использую 1.8.1 .dll вместо этого -> http://www.codeproject.com/Articles/29190/Blend-the-OGRE-Graphics-Engine-into-your-WPF-proje, но ошибка присутствует в обоих.
- OgreImage.cs - то, где проблемы происходят.
Спасибо за помощь.
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;
}