Производительность Direct2D

Итак, я уже некоторое время работаю над проектом в DirectX11, но некоторые люди предлагают мне делать это в Direct2D. Итак, я играл с этой идеей в своем проекте. В итоге я получил УЖАСНУЮ производительность. Предназначен ли Direct2D для использования с сотнями тысяч вершин? Потому что это то, что я использую.


person KairisCharm    schedule 01.02.2015    source источник
comment
Direct2D является частью DirectX, насколько я знаю. Вы используете Direct3D11? Поскольку Direct2D построен как слой поверх Direct3D, вряд ли возможно быть быстрее. Для такого количества вершин лучше использовать Direct3D с буферами вершин/индексов.   -  person Anton Angelov    schedule 08.02.2015


Ответы (1)


Direct2D предоставляет простой в использовании API для отрисовки высококачественной 2D-графики, но это приводит к снижению производительности по сравнению с тонко настроенным рендерингом dx11.

Вот примитивная стоимость розыгрыша для справки

  • FillRoundedRectangle (угол 1 пиксель): 96
  • DrawRoundedRectancle: 264
  • ЗаполнитьПрямоугольник: 6
  • DrawRectangle : 190
  • ЗаполнитьЭллипс : 204
  • DrawEllipse : 204
  • Линия (независимо от вертикали/размера...): 46
  • Безье: с 312 -> 620

Direct2d построен на устройстве уровня функций 10 и создает вершины во внутреннем буфере (единственный случай, когда он использует создание экземпляров, — это рисование текста).

Так что, если вам нужно группировать примитивы, инстанс-ящик может дать довольно приличный прирост производительности (как личный пример, мой рендеринг ключевого кадра на временной шкале сократился с 15 мс до 2 мс, заменив отрисовку с d2d на пользовательский инстансный шейдер dx11).

Если вы работаете в Windows 8, вы можете легко смешивать direct2d и direct3d в одном и том же «окне просмотра», так что это может стоить посмотреть (в моем случае я использую dx11 и структурированные буферы на основе экземпляров для всех тяжелых частей и переключаюсь на контекст direct2d для текста и других мелких элементов).

Если вам нужно нарисовать пользовательскую геометрию (особенно с достаточно большим количеством полигонов), лучше всего придерживаться Direct3D11, так как он полностью предназначен для этого.

person mrvux    schedule 09.04.2015
comment
что означают цифры в «примитивной стоимости розыгрыша»? - person Elad Maimoni; 13.02.2020
comment
Это входные данные ассемблера для каждого примитива, поэтому, например, fillrectangle составляет 6 индексов (например, 2 треугольника). - person mrvux; 14.02.2020