Взаимодействие Direct2D Direct3d11 — может ли устройство быть потеряно?

В моем приложении я использую direct2d для записи в общую (d3d11/d3d10) текстуру. Это единственный тип цели рендеринга, который используется в моем приложении. Поскольку в direct2d устройства могут быть потеряны (D2DERR_RECREATE_RENDER_TARGET), существует множество кода для абстрагирования и/или воссоздания ресурсов, зависящих от устройств. Тем не менее, я еще не видел, чтобы эта ситуация действительно происходила, и мне любопытно, не трачу ли я усилия впустую. Может ли цель рендеринга действительно быть потеряна в этом сценарии, или я защищен, поскольку текстура создается через d3d11 (хотя и совместно с d3d10)? Если да, то знает ли кто-нибудь воспроизводимый, простой способ вызвать потерю цели рендеринга, чтобы я мог хотя бы протестировать код, обрабатывающий это условие?


person Krazzy    schedule 01.01.2013    source источник
comment
вы пробовали изменить разрешение рабочего стола?   -  person kerim    schedule 02.01.2013
comment
Спасибо за предложение, но да - и цель рендеринга еще не потеряна. Я также пробовал переключаться с полноэкранного режима на оконный, изменять размер окна и блокировать/разблокировать рабочий стол.   -  person Krazzy    schedule 02.01.2013
comment
Может быть, отправил компьютер в спящий/спящий режим?   -  person kerim    schedule 02.01.2013
comment
ничего себе - ни сон, ни даже спящий режим не приводят к потере цели рендеринга.   -  person Krazzy    schedule 02.01.2013
comment
Это просто потрясающе! Авторы драйверов действительно преодолели себя со времен dx8, когда было достаточно, насколько я помню, просто Alt-Tab из полноэкранного приложения, чтобы потерять все устройство! У меня просто нет идей, что еще можно сделать, когда драйвер может обрабатывать режим сна/гибернации. Выдержит ли он выключение ПК? ;)   -  person kerim    schedule 03.01.2013
comment
Получил еще два - отсоединение дополнительного монитора и обновление драйвера устройства.   -  person kerim    schedule 03.01.2013
comment
Не забывайте о доступе к приложению через удаленный рабочий стол / службы терминалов.   -  person Rick Brewster    schedule 04.01.2013


Ответы (2)


Это не напрасные усилия. Многие сценарии могут привести к потере устройства. Простой способ вызвать это в целях тестирования — обновить графический драйвер. Ваше приложение должно изящно справиться с этим. Это также может произойти за кулисами, если ваш графический драйвер выйдет из строя или Центр обновления Windows установит новую версию в фоновом режиме. Бывают и другие случаи, но эти, наверное, самые распространенные.

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

person Kenny Kerr    schedule 17.01.2013

Цель рендеринга окна D2D всегда будет потеряна, когда другая программа использует любую версию D3D API для перехода в полноэкранный режим и обратно (эксклюзивный режим, а не новый оконный режим, поддерживаемый с D3D10/11). Я думаю, что в D3D11 вам нужно изменить разрешение, чтобы цель рендеринга D2D была потеряна.

Так что, если вы не получаете D2DERR_RECREATE_RENDER_TARGET HRESULT в этом случае при представлении вашей цели рендеринга текстуры, то, возможно, вам не нужно повторно создавать цель рендеринга, но я все равно обработаю D2DERR_RECREATE_RENDER_TARGET. Чтобы проверить это, вы можете просто заменить цель рендеринга текстуры на цель рендеринга окна во время разработки.

person me34234    schedule 24.04.2014