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