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

StackOverflow https://stackoverflow.com/questions/1074813

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

Microsoft теперь также имеет Директ2D, то есть 2D-рисование с аппаратным ускорением:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top