С# WinForms - кто-нибудь знает библиотеку С# С#, а не SLOW GDI +
GDI + очень медленный, почти полностью программный, тогда как GDI сильно аппаратно ускорен.
GDI + - это то, что класс Graphics использует в WinForms, и он слишком медленный.
Кто-нибудь создал библиотеку .NET GDI, чтобы мы могли иметь скорость?
[EDIT]
Многие рекомендуют OpenGL/DirectX. Требованием моей является совместимость с клиентом, особенно удаленный рабочий стол. Удаленный рабочий стол AFAIK не поддерживает OGL/DirectX. [/EDIT]
Ответы
Ответ 1
Отрисовка текста в GDI + медленнее, чем GDI. Microsoft поняла это после .NET 1.1.
Вот почему .NET 2.0 содержит новый класс TextRenderer
, который обертывает GDI DrawText. Он имеет два статических метода:
В .NET 2.0 все элементы управления WinForm были преобразованы в использование TextRenderer
, а не:
- Graphics.MeasureString
- Graphics.DrawString
(если вы отключите off UseCompatibleTextRendering
)
Рисование a Bitmap
также медленное в GDI +, поэтому вы используете CachedBitmap
. Это очень быстро.
A CachedBitmap объект хранит растровое изображение в формате, который оптимизирован для отображения на конкретном устройстве. Чтобы отобразить кэшированное растровое изображение, вызовите метод Graphics:: DrawCachedBitmap.
graphics.DrawCachedBitmap(bitmap, 0, 0);
См. также
Ответ 2
Вы проверили SlimDX? Он имеет управляемую оболочку Direct2D, которая является полностью аппаратно ускоренным 2d API, а также хорошо сочетается с традиционным GDI.
Edit:
Я также нашел эту библиотеку, которая может оказаться интересной: SharpDX
"SharpDX предназначен для использования в качестве альтернативной управляемой среды DirectX. API создается автоматически из заголовков DirectX SDK с целью AnyCpu, что означает, что вы можете запускать свое приложение на платформе x86 и x64 без перекомпиляции вашего проекта или установки сборок в GAC. SharpDX также является самой быстрой версией Managed-DirectX."
Это также поддерживает Direct2D.
Ответ 3
В Microsoft Code Code Pack (Archived Feb. 2010) есть примеры вызова DirectX API из управляемых языков.
Вы можете получить WindowsAPICodePack-DirectX в Nuget.
Ответ 4
Вы можете попробовать перейти в WPF.
Я сделал это, потому что WinForms рисуют медленно.
Переход очень тяжелый, особенно для старомодных кодеров, таких как я.
Но WinForms не могут быть избиты при скорости запуска и ОЗУ.
WPF запускается медленно и занимает много оперативной памяти.
Ответ 5
Если ваше приложение является кросс-платформенным, я бы рекомендовал использовать OpenTK, который является управляемой оболочкой для OpenGL и часто проще чтобы узнать, чем DirectX (управляемый или родной). OpenTK/OpenGL, как правило, обеспечивают лучшую производительность, чем DirectX. С помощью OpenTK вы можете полностью нарисовать свое изображение на графическом процессоре, а затем растрировать его в растровое изображение, которое может взаимодействовать с классом Bitmap в System.Drawing.