Ищете более быстрое, чем GDI, решение для рендеринга графиков динамических данных.

Я написал простой графопостроитель данных на основе GDI с использованием C++/CLI, но он не особенно быстр (некоторые базовые профили указывают, что проблема заключается в отображении на экране).

Есть ли способ включить аппаратное ускорение для UserControl или есть ли интерфейс .net для Direct3D? ... или есть какие-то другие варианты, которые я мог бы рассмотреть.

Мы используем управляемый код, поэтому решение действительно должно быть совместимо с CLI, если это вообще возможно.

[Edit] Если это поможет, я разбиваю полосы (128 точек данных) прямоугольников, каждый из которых имеет размер 2x2 пикселя, используя Graphics::FillRectangle. Может быть, есть лучший способ сделать это?


person Jon Cage    schedule 02.07.2009    source источник


Ответы (5)


Управляемый DirectX уже давно объявлен устаревшим. Вы действительно не хотите использовать это. Вместо этого следует использовать SlimDX, который представляет собой уровень взаимодействия с открытым исходным кодом для API DirectX SDK, написанный на C++/CLI. Это лучше, чем Managed DirectX, и поддерживается экспертным сообществом разработчиков. (Я собираюсь работать с ними над улучшением поддержки DirectWrite в ближайшее время.)

person legalize    schedule 17.07.2009
comment
у вас есть ссылка на управляемый directx, в которой говорится, что он устарел - person Ahmed Said; 07.08.2009
comment
У меня нет под рукой ссылки, но она уже давно устарела. В SDK за март 2009 г. говорится об этом в разделе «Старые компоненты»: ‹blockquote›Эти технологии были удалены из выпуска от ноября 2007 г.: DirectAnimation, Managed DX 1.1, Direct3D Retained Mode и DirectPlay Voice. годы. - person legalize; 05.09.2009

По моему опыту, вы не получите достаточно хорошей производительности от использования GDI+. Даже при простом рисовании вы быстро поймете, что накладных расходов много.

Альтернативой может быть (как вы упомянули) Direct3D, или вы можете рассмотреть обычный GDI с системными вызовами. Это, очевидно, делает код зависимым от платформы, но может быть довольно быстрым. У меня были хорошие результаты, используя это.

Все зависит от того, с какой сложностью вы готовы иметь дело. GDI может быть относительно простым, если вы разберетесь с основами, Direct3D немного сложнее. Хотя Direct3D более ориентирован на будущее.

person Jordy Boom    schedule 02.07.2009
comment
Есть ли у D3D оболочка .net? Я пытался найти его, но тот факт, что я еще не нагуглил ничего полезного, предполагает, что ответ, вероятно, отрицательный. - person Jon Cage; 02.07.2009
comment
DirectX/Direct3D уже имеет управляемый интерфейс, который предоставляется при получении SDK. Если вы ищете упрощенный интерфейс, я не уверен, что достойный существует. Я не думаю, что маловероятно, что существует абстрактный холст, который может использовать Direct3D за кулисами. - person Jordy Boom; 02.07.2009
comment
Ах, я не знал, что он пришел с паршивым интерфейсом. Я попробую - большое спасибо! - person Jon Cage; 02.07.2009

Это правда, что GDI+ не очень хорош с точки зрения производительности, однако я сам написал плоттер GDI+ в проекте, связанном с работой, который способен выдавать графики с тысячей точек при ~30 кадрах в секунду при разрешении 1680x1050 (график прокрутки ).

Для этого потребовалось много настроек:

  • Преобразуйте все в один единственный путь перед рисованием.
  • Если вы используете задний буфер, используйте его с форматом пикселей Format32bppPArgb, это может ускорить блиттинг в 2-4 раза.
  • Если вы рисуете путь с много вертикальных линий (высокочастотный сигнал), нарисуйте их как горизонтальные линии на заднем буфере, а затем нарисуйте на экране повернутое изображение. Имейте в виду, что рисование повернутого изображения также имеет определенную стоимость.

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

Кстати, о каком разрешении и частоте кадров здесь идет речь?

person BeeWarloc    schedule 07.08.2009
comment
На самом деле это больше похоже на 6,5 тыс. точек (128*360/7). Разрешение довольно низкое (~ 500 * 500 пикселей). Каждая точка нарисована в виде прямоугольника - посмотрите мой другой пост (stackoverflow.com/questions/1055920/). Мы можем немного схитрить, потому что я записываю только 128 * 2 точки каждый раз, когда получаю новые данные. - person Jon Cage; 07.08.2009

Теперь у Microsoft также есть Direct2D, который представляет собой двухмерное рисование с аппаратным ускорением:

Direct2D — это API-интерфейс для двухмерной графики с аппаратным ускорением и немедленным режимом, который обеспечивает высокую производительность и высококачественный рендеринг для двухмерной геометрии, растровых изображений и текста. API Direct2D спроектирован так, чтобы хорошо взаимодействовать с GDI, GDI+ и Direct3D.

Для этого требуется Windows 7/Server 2008 R2, но поддержка была добавлена ​​в Vista/Server 2008 через платформу. Обновление:

person Ian Boyd    schedule 20.01.2010

Я искал похожее решение, когда заканчивал перенаправлять поток данных с помощью моего беспроводного . thermo EPD для рендеринга графического текста для моего ПК. Я, вероятно, нашел бы способ вылепить возможный способ из комментариев выше.

Следует отметить, что аппаратное ускорение поддерживается не для всех операций 2D-рисования, его включение может повлиять на некоторые из ваших пользовательских представлений или вызовов рисования.

person kayode10    schedule 15.03.2020