
|
|
Проблема потерянных устройств
В прошлом уроке мы научились с вами создавать полноэкранные приложения D3D8. Но теперь мы столкнулись с одной проблемой (спасибо Tony McMahon - он указал мне на это упущение в моем коде, и благодаря этому появился этот урок) - проблемы потерянных устройств. Когда пользователь нажимает в полноэкранном приложении Alt+Tab и сворачивает свою программу, и после того как он возвращается к своему приложению, его устройство D3D8 оказывается потерянным. Эта проблема достаточно легко решается, так что этот урок будет не большим. Покопавшись в документации я нашел, как решить данную проблему и теперь предлагаю ее решение вам. Во первых - в самом начале в функции RenderScreen() мы вставляем несколько строк : Здесь мы проверяем уровень кооперации нашего приложения, и затем мы имеем два варианта : -- если у нас устройство оказывается потерянным то
мы ничего не можем сделать и выходим из функции (затем мы снова возвращаемся в
нее, проверяем уровень кооперации и так далее, пока не получим второй вариант)
Теперь второй шаг - при создании нашего буфера вершин мы использовали флаг D3DPOOL_DEFAULT - этот флаг показывает D3D8, что бы он установил менеджер ресурсов в состояние по умолчанию (как он работает, в данном случае не важно) на важно то, что в данном случае при потере устройства мы теряем данные, и нам, перед вызовом p_d3d_Device->Reset(&d3dp); необходимо их удалить и создавать заново. Но, опять же покопавшись в документации, я нашел что вместо этого флага можно использовать другой - D3DPOOL_MANAGED - он позволяет D3D8 самому управлять ресурсами, и при потере устройства такие ресурсы не теряются, и нам их пересоздавать не нужно. В данном виде ваша строка создания буфера вершин должна выглядеть следующим образом : Теперь вы можете безбоязненно нажимать Alt+Tab и все будет в порядке... |
![]() |