一段时间后,通过 SkiaSharp 使用 SwapChainPanel 时,Windows/WinUI 3 上的 .NET MAUI Windows 9.0 Preview 5 崩溃

问题描述 投票:0回答:1

问题

我们在游戏 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 模式下也会发生。

重现错误的步骤

  1. 使用以下说明编译 .NET MAUI Windows 端口: https://github.com/hyvanmielenpelit/GnollHack/wiki/Development-Information
    • 我警告你,这是一项相对艰巨的任务。
  2. 启动游戏并在设置中启用GPU加速。玩游戏一段时间直到崩溃。通常10分钟就足够了。

截图

调试器总是在执行

lock
语句时崩溃。

Debugger Screenshot

堆栈跟踪

 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] 

使用过的软件

  • Windows 11 专业版 23H2。 64 位。 22631.3737.
  • Visual Studio 2022 预览版 17.11.0 预览版 2.0。
  • .NET MAUI 9.0 预览版 5
  • .NET SDK 9.0 预览版 5
  • SkiaSharp 3.0 预览版 3.1

二手硬件

  • ProArt Studiobook H7604JV
  • 英特尔酷睿 i9-13980HX
  • nVidia Geforce RTX 4060 笔记本电脑 8 GB
  • 32 GB 内存
  • 2TB 固态硬盘
windows-runtime maui winui-3 skiasharp maui-windows
1个回答
0
投票

我们必须添加

DispatcherQueue.TryEnqueue
来对我们的
InvalidateSurface
方法进行排队。我们必须使用窗口的
DispatcherQueue
而不是附加到线程的(速度很慢)。

© www.soinside.com 2019 - 2024. All rights reserved.