我们在游戏 GnollHack 中使用 .NET MAUI 9.0 Preview 5、.NET SDK 9.0 Preview 5 和 SkiaSharp 3.0 Preview 3.1。 SkiaSharp 的 SKGLView 使用 SwapChainPanel 在 Windows/WinUI3 上渲染 GPU 加速图形。暂时一切正常,但随后游戏崩溃并出现以下异常(在“输出”→“调试”窗口中找到):
GnollHackM.exe 中的 0x00007FFB236EF39C (KernelBase.dll) 处抛出异常:WinRT 原始错误 - 0x80004005:“在此 XAML 应用程序中检测到重入。”使用调试器来定位可重入代码,并在必要时将该代码移动到异步事件处理程序。按“确定”退出应用程序。'。
Microsoft.ui.xaml.dll!00007FFA8F1137D8:CallContext:[\ ImageDecodeActivity] 8000FFFF - E_UNEXPECTED
GnollHackM.exe 中 0x00007FFA8F4A52F5 (Microsoft.ui.xaml.dll) 处未处理的异常:0xC000027B:发生应用程序内部异常(参数:0x0000022A8ED086C0、0x0000000000000003)。
这是在 Debug 模式下,但在 Release 模式下也会发生。
调试器总是在执行
lock
语句时崩溃。
GnollHackM.dll!GnollHackM.GamePage.PaintMainGamePage(object sender, SkiaSharp.Views.Maui.SKPaintSurfaceEventArgs e) Line 7517 C#
GnollHackM.dll!GnollHackM.GamePage.canvasView_PaintSurface(object sender, SkiaSharp.Views.Maui.SKPaintSurfaceEventArgs e) Line 3860 C#
GnollHackM.dll!GnollHackM.SwitchableCanvasView.internalGLView_PaintSurface(object sender, SkiaSharp.Views.Maui.SKPaintGLSurfaceEventArgs e) Line 213 C#
[External Code]
GnollHackM.dll!GnollHackM.SwitchableCanvasView.InvalidateSurface() Line 75 C#
GnollHackM.dll!GnollHackM.GamePage.UpdateMainCanvas() Line 1325 C#
GnollHackM.dll!GnollHackM.SwitchableCanvasView.OnPropertyChanged(string propertyName) Line 352 C#
[External Code]
GnollHackM.dll!GnollHackM.SwitchableCanvasView.GeneralAnimationCounter.set(long value) Line 331 C#
GnollHackM.dll!GnollHackM.GamePage.StartMainCanvasAnimation.AnonymousMethod__415_0(double v) Line 1611 C#
[External Code]
我们必须添加
DispatcherQueue.TryEnqueue
来对我们的 InvalidateSurface
方法进行排队。我们必须使用窗口的 DispatcherQueue
而不是附加到线程的(速度很慢)。