Перейти к содержанию
Fire Monkey от А до Я
  • 0

Перезапуск dxgi движка (Windows) после HandleDeviceRemoved


Nick Peterson

Вопрос

Всем привет! Как известно, FMX сама не может справится с ошибками dxgi

Что я пытался сделать:

1) в FMX.Canvas.D2D ведем список

Canvases:     TList<TCanvasD2D>;

2) после получения ошибки пытаемся пересоздать ресурсы таким образом

procedure ResetDxEngine;
var
  c:        TCanvasD2D;
begin
  for c in Canvases do c.DisposeResources;

  TCanvasD2D.DestroySharedResources;
  TCanvasD2D.CreateSharedResources;

  for c in Canvases do c.CreateResources;

end;

Это не срабатывает, канва перестает что-либо рисовать. Что я упускаю?

(Сознательно сократил коды чтобы передать максимально суть вопроса - как правильно пересоздать DirectX объекты и интерфейсы?)

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Похоже, что вы пытаетесь пересоздать ресурсы DirectX после возникновения ошибки DXGI в Delphi с использованием FireMonkey (FMX). Ваш подход в целом верный, но возможно, вы упускаете некоторые важные шаги при пересоздании ресурсов.

Вот несколько предложений, как можно улучшить ваш код:

  1. Обязательно убедитесь, что все объекты, использующие DirectX ресурсы, освобождают их перед вызовом DisposeResources. Это может включать текстуры, шейдеры, буферы и т.д.

  2. Может потребоваться вызов Device.Reset перед пересозданием общих ресурсов. Это зависит от того, каким образом вы обрабатываете ошибки DXGI в вашем коде. Вот пример, как это может выглядеть:

procedure ResetDxEngine;
var
  c: TCanvasD2D;
begin
  // Освобождаем ресурсы для каждой канвы
  for c in Canvases do c.DisposeResources;

  // Сброс устройства
  if Assigned(TCanvasD2D.Device) then
    TCanvasD2D.Device.Reset;

  // Уничтожаем и создаем общие ресурсы
  TCanvasD2D.DestroySharedResources;
  TCanvasD2D.CreateSharedResources;

  // Создаем ресурсы для каждой канвы
  for c in Canvases do c.CreateResources;
end;
  1. Если после выполнения этих шагов ваш код все еще не работает, возможно, проблема заключается в другой части вашего кода, связанной с обработкой ошибок DXGI. Проверьте, что вы корректно обрабатываете ошибки DXGI и вызываете ResetDxEngine только при необходимости.

  2. Обратите внимание, что некоторые ошибки DXGI могут быть связаны с оборудованием, и пересоздание ресурсов может не решить проблему. В таких случаях может потребоваться использование других методов восстановления, таких как переключение на программное устройство.

Помимо этого, убедитесь, что ваш код корректно обрабатывает ошибки и исключения, возникающие при работе с DirectX, чтобы вы могли предоставить информацию пользователю или предпринять дополнительные действия для восстановления работы приложения.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...