Ищете более быстрое, чем GDI, решение для рендеринга графиков динамических данных.
Вопрос
Я написал простой построитель данных на основе 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 через Обновление платформы:
- Windows 7
- Windows Сервер 2008 Р2
- Windows Vista SP2 с Обновление платформы для Windows Vista
- Windows Server 2008 SP2 с Обновление платформы для Windows Server 2008