Как нам
уже известно, в SDL2 решены основные проблемы с потерей OpenGL-контекста при различных действиях с экраном. Однако этого всё ещё можно добиться одним из двух способов, при которых
даже в Direct3D после 9.0 по-прежнему случается device loss. Это отключение / извлечение устройства (см.
DXGI_ERROR_DEVICE_REMOVED) или остановка / зависание / ошибка / вылет драйвера, приводящая к его перезагрузке (см.
DXGI_ERROR_DEVICE_RESET).
Проверить это и убедиться самому довольно просто. Особенно удобно это сделать в Windows на ноутбуке с дискретной видеокартой.
Без неё я действовать не советую, так как вырубится монитор, и придётся либо перезагружаться, либо нащупывать кнопку вслепую.
- Запускаем игру с дискретной видеокартой.
Обычно это делается через контекстное меню, пункт "Запустить с графическим процессором" / "Run with graphics processor".
- Открываем "Диспетчер устройств", щёлкаем по этой видеокарте, нажимаем "Остановить".
- Игра вылетает, даже не объяснившись.
Эта проблема хоть и незначительна, но потенциально заметна, так как в природе существуют внешние USB-видеокарты.
Я не знаю, как такая ситуация обрабатывается в самом SDL2 для его GL-рендерера (который мы не используем). Там есть
SDL_RENDER_DEVICE_RESET (он же
SDL_EVENT_RENDER_DEVICE_RESET в SDL3), который в случае D3D-рендерера получается именно из
DXGI_ERROR_DEVICE_REMOVED (а вот
DXGI_ERROR_DEVICE_RESET, похоже, нигде не ловится). Однако для OpenGL данное событие упоминается в коде, насколько я могу видеть, лишь
единожды - и да, это Android.
В нашем случае, возможно, надо как-нибудь ловить
соответствующие уведомления окна (типа
WM_DEVICECHANGE) и как-то на них реагировать. Ещё есть расширения
GL_ARB_robustness /
GL_ARB_robustness_isolation - может быть, их тоже имеет смысл применить ради большей надёжности.
Важно помнить: между "context loss" в OpenGL и "device loss" в Direct3D (до WDDM и DX10) существует заметная разница.
https://stackoverflow.com/questions/20724294/opengl-context-loss