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

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

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

Например:

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

 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

Решение

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]