2013-12-24 6 views
0

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

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

Например:

My (под заказ) Система компоновки в 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() эта последовательность отправляется в пользовательский метод С ++ все сразу (т. с помощью всего одного звонящего вызова, а не сотен, может быть, тысяч), который анализирует это и выполняет соответствующие, фактические вызовы Direct2D API изначально.

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

+0

У вас будет штраф за исполнение при декодировании команды рисования и их параметров в собственном коде. – Spook

+0

Очевидно. Вопрос в том, меньше ли это наказание, чем маршалинг многих индивидуальных призывов к обращению от управляемого кода. – d7samurai

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^