Пользовательский Direct2D рендеринг пакетного маршалинга между управляемым и неуправляемым кодом

0

Недавно я начал обходить оболочку SharpDX, чтобы получить высокопроизводительный графический вывод из приложения С#. Согласно его создателям, штраф за производительность, связанный с использованием SharpDX (их собственные номера показывают, что переход через SharpDX примерно на 2 раза медленнее, чем взаимодействие с DirectX от собственного кода) в основном происходит из-за сортировки обратных вызовов из управляемого кода в базовый API.

Поэтому я задаюсь вопросом, было бы хорошей идеей создать какую-то доработку этих вызовов на легком "языке описания", чтобы сократить количество маршированных вызовов на обновление экрана до одного. Я подумываю о подходе, в котором я переписываю вызовы в таблицу байтов-массивов, которая может быть отправлена за один проход к методу C++, который, в свою очередь, будет декодировать это в соответствующие собственные вызовы D2D.

Например:

Моя (обычная) макетная система в С# собирала все, что должно быть отображено для следующего обновления экрана в списке, а (так называемое описание):

 1. define brush1(color(FF, 00, 00))
 2. define brush2(color(00, FF, 00))
 3. draw ellipse(brush1, origin(0, 0), radius(15, 15))
 4. draw ellipse(brush2, origin(127, 127), radius(255, 255))
 5. draw ellipse(brush2, origin(127, 0), radius(255, 255))
 6. ...

Этот список затем может быть закодирован как байтовый массив (для простоты координаты указаны в байтах в этом примерном примере):

1. 01 01 FF 00 00
2. 01 02 00 FF 00
3. 10 01 00 00 0F 0F
4. 10 02 7F 7F FF FF
5. 10 02 7F 00 FF FF
6. ...

Затем в Render() эта последовательность отправляется по специальному методу C++ все сразу (т.е. Только с одним маршированным вызовом, а не сотнями, может быть, тысячами), который анализирует это и выполняет соответствующие фактические вызовы Direct2D API изначально.

Является ли такой подход жизнеспособным?

  • 0
    Вы будете иметь снижение производительности при декодировании инструкции отрисовки и их параметров в нативном коде.
  • 0
    Очевидно. Вопрос в том, меньше ли это наказание, чем маршалинг многих отдельных вызовов отрисовки из управляемого кода.
Теги:
marshalling
sharpdx
direct2d

1 ответ

0

Я написал приложение, которое использует Direct2D (а также Direct3D) для быстрого рисования графиков функций. Я решил использовать другой подход и объединил весь чертеж вместе с логикой управления позади него к собственному коду. Таким образом, мне не нужно передавать информацию о том, что рисовать, потому что собственный код уже знает об этом. Единственные штрафы за производительность - это передача данных из управляемого неуправляемого кода, но они O (1) s, поэтому я не беспокоюсь о них.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню