Поиск решения для визуализации динамических графиков данных быстрее, чем GDI


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

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

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

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

4 2

4 ответа:

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

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

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

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

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

Потребовалось много настройки, чтобы достичь этого:

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

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

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

Microsoft теперь также имеет Direct2D, который является аппаратно ускоренным 2D-чертежом:

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

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