.NET MAUI Windows 9.0 Preview 5 в Windows/WinUI 3 через некоторое время аварийно завершает работу при использовании SwapChainPanel через SkiaSharp

Проблема

В нашей игре GnollHack мы используем .NET MAUI 9.0 Preview 5, .NET SDK 9.0 Preview 5 и SkiaSharp 3.0 Preview 3.1. SKGLView из SkiaSharp использует SwapChainPanel для рендеринга графики с ускорением графического процессора в Windows/WinUI3. Некоторое время все работает нормально, но затем игра вылетает со следующим исключением (находится в окне «Вывод → Отладка»):

Исключение, созданное по адресу 0x00007FFB236EF39C (KernelBase.dll) в GnollHackM.exe: ошибка источника WinRT — 0x80004005: «В этом приложении XAML обнаружен повторный вход. Используйте отладчик, чтобы найти реентерабельный код и, при необходимости, переместите этот код в асинхронный обработчик событий. Нажмите ОК, чтобы выйти из приложения.'.

Microsoft.ui.xaml.dll!00007FFA8F1137D8: CallContext:[\ImageDecodeActivity] 8000FFFF — E_UNEXPECTED

Необработанное исключение по адресу 0x00007FFA8F4A52F5 (Microsoft.ui.xaml.dll) в GnollHackM.exe: 0xC000027B: произошло внутреннее исключение приложения (параметры: 0x0000022A8ED086C0, 0x0000000000000003).

Это происходит в режиме отладки, но это происходит и в режиме выпуска.

Действия по воспроизведению ошибки

  1. Скомпилируйте порт .NET MAUI для Windows, используя следующие инструкции: https://github.com/hyvanmielenpelit/GnollHack/wiki/Development-Information
    • Предупреждаю, это относительно большая задача.
  2. Запустите игру и в настройках включите ускорение графического процессора. Поиграйте в игру некоторое время, пока она не вылетит. 10 минут обычно достаточно.

Скриншот

Отладчик всегда завершает работу при выполнении оператора 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] 

Используемое программное обеспечение

  • 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
  • Intel Core i9-13980HX
  • Ноутбук nVidia Geforce RTX 4060 8 ГБ
  • 32 ГБ ОЗУ
  • SSD-накопитель емкостью 2 ТБ

Похоже, проблема с потоками. Почему у вас есть блокировки повсюду в том, что кажется методом пользовательского интерфейса (поэтому к нему должен обращаться только один поток)? Вы вызываете этот метод с несколькими потоками? И даже с блокировками этот тип кода неверен if (_currentGame != null) { lock (_currentGame.WindowsLock) { for (int i = 0; _currentGame.Windows..., поскольку ссылку _currentGame следует скопировать локально (во время блокировки она может стать нулевой)

Simon Mourier 19.06.2024 14:46

Спасибо. Я сообщил нашему программисту. Надеюсь, ему удастся провести рефакторинг кода в соответствии с лучшими практиками.

Tommi Gustafsson 19.06.2024 15:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нам пришлось добавить DispatcherQueue.TryEnqueue в очередь нашего метода InvalidateSurface. Нам пришлось использовать окно DispatcherQueue, а не то, которое прикреплено к нитке (это было медленно).

Другие вопросы по теме