Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Ресурс Direct2D — это объект, используемый для рисования и представленный интерфейсом Direct2D, например ID2D1Geometry или ID2D1RenderTarget. В этом разделе описываются типы ресурсов Direct2D и их совместное использование.
Этот раздел состоит из следующих подразделов.
- Сведения о ресурсах Direct2D
- Device-Independent ресурсы
- Device-Dependent ресурсы
- Общий доступ к ресурсам фабрики
- Обмен ресурсами целевого экрана
Сведения о ресурсах Direct2D
Многие аппаратно-ускоренные API 2D предназначены для ресурсной модели, ориентированной на центральный процессор, и для набора операций отрисовки, которые хорошо работают на центральном процессоре. В дальнейшем некоторые части API ускоряются аппаратно. Для реализации этих API требуется диспетчер ресурсов для сопоставления ресурсов ЦП с ресурсами на GPU. Из-за ограничений GPU некоторые операции могут быть не в состоянии ускориться во всех обстоятельствах. В таких случаях диспетчер ресурсов должен обмениваться данными между ЦП и GPU (что дорого), чтобы он смог перейти на отрисовку ЦП. В некоторых случаях может неожиданно произойти рендеринг, который будет полностью выполняться на центральном процессоре. Кроме того, для операций отрисовки, кажущихся простыми, могут потребоваться временные промежуточные этапы отрисовки, которые не показаны в API и требуют дополнительных ресурсов GPU.
Direct2D обеспечивает более прямое сопоставление, позволяющее полностью задействовать GPU. Он предоставляет две категории ресурсов: независимые от устройств и зависящие от устройства.
- Ресурсы, независимые от устройств, такие как ID2D1Geometry, хранятся на ЦП.
- Ресурсы, зависящие от устройств, такие как ID2D1RenderTarget и ID2D1LinearGradientBrush, напрямую сопоставляются с ресурсами на GPU (когда аппаратное ускорение доступно). Вызовы отрисовки выполняются путем объединения сведений о вершинах и покрытии геометрии с текстурной информацией, созданной ресурсами, зависящими от устройства.
При создании ресурсов, зависящих от устройств, системные ресурсы (GPU, если они доступны или ЦП) выделяются при создании устройства и не изменяются с одной операции отрисовки на другую. Эта ситуация устраняет необходимость в диспетчере ресурсов. Помимо общих улучшений производительности, предоставляемых ликвидацией диспетчера ресурсов, эта модель позволяет напрямую управлять любой промежуточной отрисовкой.
Так как Direct2D обеспечивает так много контроля над ресурсами, необходимо понимать различные виды ресурсов и когда их можно использовать вместе.
Device-Independent Ресурсы
Как описано в предыдущем разделе, ресурсы, независимые от устройств, всегда находятся на ЦП и никогда не связаны с аппаратным устройством отрисовки. Ниже приведены независимые от устройства ресурсы:
- ID2D1DrawingStateBlock
- ID2D1Factory
- Id2D1Geometry и интерфейсы, наследуемые от него.
- ID2D1GeometrySink и ID2D1SimplifiedGeometrySink
- ID2D1StrokeStyle
Используйте 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_PROPERTIES, используемой для создания целевого объекта отрисовки, на значение D2D1_RENDER_TARGET_TYPE_HARDWARE.
Целевые объекты отрисовки DXGI Surface
Ресурсы, созданные целевым объектом отрисовки поверхности DXGI, можно разделять с любым другим целевым объектом отрисовки поверхности DXGI, который использует то же самое базовое устройство Direct3D.
Совместимые целевые объекты отрисовки и общие растровые изображения
Вы можете совместно использовать ресурсы между целевым объектом отрисовки и совместимыми целевыми объектами отрисовки, созданными этим целевым объектом отрисовки. Чтобы создать совместимый целевой объект отрисовки, используйте метод ID2D1RenderTarget::CreateCompatibleRenderTarget .
Метод ID2D1RenderTarget::CreateSharedBitmap можно использовать для создания идентификатора ID2D1Bitmap , который можно совместно использовать между двумя целевыми объектами отрисовки, указанными в вызове метода, если метод выполнен успешно. Этот метод будет выполнен успешно, пока два целевых объекта отрисовки используют то же базовое устройство для отрисовки.