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


Обзор ресурсов

Ресурс Direct2D — это объект, который используется для рисования и представлен интерфейсом Direct2D, например ID2D1Geometry или ID2D1RenderTarget. В этом разделе описываются типы ресурсов Direct2D и способы их совместного использования.

Этот раздел состоит из следующих подразделов.

Сведения о ресурсах Direct2D

Многие аппаратные 2D API разработаны на основе модели ресурсов, ориентированной на ЦП, и набора операций отрисовки, которые хорошо работают на ЦП. Затем часть API выполняется с аппаратным ускорением. Для реализации этих API требуется диспетчер ресурсов для сопоставления ресурсов ЦП с ресурсами gpu. Из-за ограничений GPU некоторые операции могут быть не в состоянии ускориться при любых обстоятельствах. В таких случаях диспетчер ресурсов должен обмениваться данными между ЦП и GPU (что является дорогостоящим), чтобы он смог перейти к отрисовке ЦП. В некоторых случаях это может непредсказуемо заставить отрисовку полностью вернуться к ЦП. Кроме того, для простых операций отрисовки могут потребоваться временные промежуточные этапы отрисовки, которые не предоставляются в API и требуют дополнительных ресурсов GPU.

Direct2D обеспечивает более прямое сопоставление с полным использованием GPU. Он предоставляет две категории ресурсов: независимые от устройства и зависящие от устройства.

  • Независимые от устройства ресурсы, такие как ID2D1Geometry, хранятся на ЦП.
  • Зависимые от устройства ресурсы, такие как ID2D1RenderTarget и ID2D1LinearGradientBrush, напрямую сопоставляются с ресурсами gpu (если доступно аппаратное ускорение). Вызовы отрисовки выполняются путем объединения вершин и сведений о покрытии из геометрии с информацией о текстурировании, полученной ресурсами, зависящими от устройства.

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

Так как Direct2D обеспечивает большой контроль над ресурсами, необходимо понимать различные типы ресурсов и время их совместного использования.

Ресурсы Device-Independent

Как описано в предыдущем разделе, независимые от устройства ресурсы всегда находятся на ЦП и никогда не связаны с аппаратным устройством отрисовки. Ниже приведены независимые от устройства ресурсы.

Используйте ID2D1Factory, сам ресурс, независимый от устройства, для создания независимых от устройств ресурсов. (Чтобы создать фабрику, используйте функцию CreateFactory .)

За исключением целевых объектов отрисовки, все ресурсы, созданные фабрикой, не зависят от устройств. Целевой объект отрисовки является ресурсом, зависящим от устройства.

Ресурсы Device-Dependent

Любой ресурс, не именованный в предыдущем списке, является ресурсом, зависящим от устройства. Ресурсы, зависящие от устройства, связаны с определенным устройством отрисовки. Если доступно аппаратное ускорение, это устройство является GPU. В других случаях это ЦП.

Чтобы создать большинство зависимых от устройства ресурсов, используйте целевой объект отрисовки. В большинстве случаев для создания целевого объекта отрисовки используется фабрика.

Ниже приведены примеры ресурсов, зависящих от устройств.

  • ID2D1Brush и интерфейсы, которые наследуют от него. Используйте целевой объект отрисовки для создания кистей.
  • ID2D1Layer. Используйте целевой объект отрисовки для создания слоев.
  • ID2D1RenderTarget и интерфейсы, которые наследуют от него. Чтобы создать целевой объект отрисовки, используйте фабрику или другой целевой объект отрисовки.

Примечание

Начиная с Windows 8, существуют новые интерфейсы, которые создают зависимые от устройств ресурсы. ID2D1Device и ID2D1DeviceContext могут совместно использовать ресурс, если контекст устройства и ресурс созданы на основе одного id2D1Device.

 

Ресурсы, зависящие от устройств, становятся непригодными для использования, когда связанные устройства отрисовки становятся недоступными. Это означает, что при получении ошибки D2DERR_RECREATE_TARGET для целевого объекта отрисовки необходимо повторно создать целевой объект отрисовки и все его ресурсы.

Общий доступ к ресурсам фабрики

Вы можете совместно использовать все независимые от устройства ресурсы, созданные фабрикой, со всеми другими ресурсами (независимыми от устройств или зависимыми от устройства), созданными той же фабрикой. Например, можно использовать два объекта ID2D1RenderTarget для рисования одного и того же ID2D1RectangleGeometry , если оба этих объекта ID2D1RenderTarget были созданы одной фабрикой.

Интерфейсы приемника (ID2D1SimplifiedGeometrySink, ID2D1GeometrySink и ID2D1TessellationSink) могут использоваться совместно с ресурсами, созданными любой фабрикой. В отличие от других интерфейсов в Direct2D, можно использовать любую реализацию интерфейса приемника. Например, можно использовать собственную реализацию ID2D1SimplifiedGeometrySink.

Совместное использование целевых ресурсов отрисовки

Возможность совместного использования ресурсов, созданных целевым объектом отрисовки, зависит от типа целевого объекта отрисовки. При создании целевого объекта отрисовки типа D2D1_RENDER_TARGET_TYPE_DEFAULT ресурсы, созданные этим целевым объектом отрисовки, могут использоваться только этим целевым объектом отрисовки (если целевой объект отрисовки не вписывается в одну из категорий, описанных в следующих разделах). Это происходит потому, что вы не знаете, какое устройство в конечном итоге будет использовать целевой объект отрисовки. Это может привести к отрисовке на локальном оборудовании, программном обеспечении или на оборудовании удаленного клиента. Например, можно написать программу, которая перестает работать, когда она отображается удаленно или когда размер целевого объекта отрисовки превышает максимальный размер, поддерживаемый оборудованием отрисовки.

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

Целевые объекты отрисовки оборудования

Вы можете совместно использовать ресурсы для любого целевого объекта отрисовки, который явно использует оборудование, при условии, что режим удаленного взаимодействия совместим. Режим удаленного взаимодействия гарантируется только в том случае, если оба целевых объекта отрисовки используют флаг D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING или D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE или если ни одно из этих флагов не указано. Эти параметры гарантируют, что ресурсы всегда будут находиться на одном компьютере. Чтобы указать режим использования, задайте поле использованияструктуры D2D1_RENDER_TARGET_PROPERTIES , которая использовалась для создания целевого объекта отрисовки с одним или несколькими флагами D2D1_RENDER_TARGET_USAGE .

Чтобы создать целевой объект отрисовки, который явно использует аппаратную отрисовку, задайте для D2D1_RENDER_TARGET_TYPE_HARDWARE поле типа структуры D2D1_RENDER_TARGET_PROPERTIES, которая использовалась для создания целевого объекта отрисовки.

DXGI Surface Render Targets

Вы можете совместно использовать ресурсы, созданные целевым объектом отрисовки поверхности DXGI, с любым другим целевым объектом отрисовки поверхности DXGI, использующим то же базовое устройство Direct3D.

Совместимые целевые объекты отрисовки и общие растровые изображения

Вы можете совместно использовать ресурсы между целевым объектом отрисовки и совместимыми целевыми объектами отрисовки, созданными этим целевым объектом отрисовки. Чтобы создать совместимый целевой объект отрисовки, используйте метод ID2D1RenderTarget::CreateCompatibleRenderTarget .

Вы можете использовать метод ID2D1RenderTarget::CreateSharedBitmap , чтобы создать id2D1Bitmap , который можно совместно использовать между двумя целевыми объектами отрисовки, указанными в вызове метода, если метод будет выполнен успешно. Этот метод будет успешным, если два целевых объекта отрисовки используют одно и то же базовое устройство для отрисовки.