Поделиться через


Работа с несколькими системами мониторинга (Direct3D 9)

Концепция монопольного полноэкранного режима сохраняется в Direct3D 9, но она полностью неявна в вызовах методов IDirect3D9::CreateDevice и IDirect3DDevice9::Reset . При каждом успешном сбросе или создании устройства в полноэкранном режиме объект Direct3D, создавший устройство, помечается как владеющий всеми адаптерами в этой системе. Это состояние называется монопольным режимом, и на этом этапе объект Direct3D владеет монопольным режимом. Монопольный режим означает, что устройства, созданные любым другим объектом Direct3D9, не могут ни предполагать работу в полноэкранном режиме, ни выделять видеопамять. Кроме того, когда объект Direct3D9 принимает монопольный режим, все устройства, кроме устройства, которое перешло в полноэкранный режим, переводятся в состояние пропажи. Сведения о том, как обрабатывать потерянные устройства, см. в разделе Потерянные устройства (Direct3D 9).

Наряду с монопольным режимом объект Direct3D9 сообщается о окне фокуса, которое будет использоваться устройством. Монопольный режим освобождается, когда последнее полноэкранное устройство, принадлежащее данному объекту Direct3D9, сбрасывается в оконный режим или уничтожается.

Устройства можно разделить на две категории, если объект Direct3D9 владеет монопольным режимом. Первая категория устройств — это устройства, созданные тем же объектом Direct3D9, который создал устройство, которое уже является полноэкранным, имеет то же окно фокуса, что и устройство, которое уже является полноэкранным, и представляет собой адаптер, отличный от любого полноэкранного устройства. Устройства в этой категории не имеют ограничений по возможности сброса или создания и не переводятся в потерянное состояние. Устройства в этой категории можно даже переводить в полноэкранный режим.

Устройства, не хранящиеся в этой категории, созданные другим объектом Direct3D9 или с другим окном фокуса, или для некоторых адаптеров с устройством, уже имеющим полноэкранный режим, не могут быть сброшены и остаются в потерянном состоянии до потери монопольного режима.

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

При создании устройства с помощью того же объекта IDirect3D9 и окна фокуса исходное устройство потеряет свои поверхности. Вам потребуется вызвать IDirect3DDevice9::Reset на первом устройстве, чтобы приложение пользовалось им. Например, чтобы создать два устройства, сделайте следующее:

  1. Создание устройства 1
  2. Создание устройства 2
  3. Сброс устройства 1

Советы по программированию