C # WinForms - любой, кто знает библиотеку C # GDI, не МЕДЛЕННЫЙ GDI + - PullRequest
14 голосов
/ 18 июня 2011

GDI + очень медленный, почти полностью программный, тогда как GDI сильно аппаратно ускорен. GDI + - это то, что класс Graphics использует в WinForms, и он слишком медленный.

Кто-нибудь создал библиотеку .NET GDI, чтобы у нас была скорость?

[EDIT] Многие люди рекомендуют OpenGL / DirectX. Моим требованием является совместимость клиента, особенно удаленного рабочего стола. Удаленный рабочий стол AFAIK не поддерживает OGL / DirectX из коробки. [/ EDIT]

Ответы [ 5 ]

24 голосов
/ 25 июня 2011

Рендеринг текста в GDI + медленнее, чем в GDI.Microsoft поняла это после .NET 1.1.

Именно поэтому .NET 2.0 содержит новый класс TextRenderer, охватывающий GDI DrawText .Он имеет два статических метода:

В .NET 2.0 все элементы управления WinForm были преобразованы для использования TextRenderer вместо:

  • Graphics.MeasureString
  • Graphics.DrawString

(при условии, что вы выключили UseCompatibleTextRendering)


Рисование Bitmap также является медленным в GDI +, чтоВот почему вы используете CachedBitmap.Он рисует очень быстро.

A CachedBitmap объект хранит растровое изображение в формате, оптимизированном для отображения на определенном устройстве.Чтобы отобразить кэшированное растровое изображение, вызовите метод Graphics :: DrawCachedBitmap .

graphics.DrawCachedBitmap(bitmap, 0, 0);

См. Также

7 голосов
/ 18 июня 2011

Вы проверили SlimDX ? Он имеет управляемую оболочку около Direct2D , которая является полностью аппаратно ускоренным 2d API и хорошо сочетается с традиционным GDI.

Edit:

Мне также показалась интересной эта библиотека: SharpDX

"SharpDX предназначен для использования в качестве альтернативной управляемой среды DirectX. API генерируется автоматически из заголовков DirectX SDK с целью AnyCpu, что означает, что вы можете запускать свое приложение на платформе x86 и x64 без перекомпиляции проекта или установки сборок в GAC. SharpDX также является самой быстрой реализацией Managed-DirectX. "

Также имеется поддержка Direct2D.

2 голосов
/ 21 июня 2011

Пакет API для Microsoft (заархивирован в феврале 2010 г.) содержит примеры вызова API DirectX из управляемых языков.

Вы можете получить WindowsAPICodePack-DirectX на Nuget.

1 голос
/ 18 июня 2011

Вы можете попробовать перейти на WPF.
Я сделал это, потому что WinForms рисуют медленно.
Переход очень сложный , особенно для старомодных кодеров, таких как я.

Но WinForms нельзя превзойти при скорости запуска и ОЗУ.
WPF запускается медленно и занимает много ОЗУ.

0 голосов
/ 19 июня 2011

Если ваше приложение является кроссплатформенным, я бы порекомендовал использовать OpenTK , который является управляемой оболочкой для OpenGL и часто проще в освоении, чем DirectX (управляемый или собственный).OpenTK / OpenGL, как правило, обеспечивают лучшую производительность, чем DirectX.С помощью OpenTK вы можете полностью нарисовать изображение в графическом процессоре, а затем растеризовать его в растровое изображение, которое может взаимодействовать с классом растрового изображения в System.Drawing.

...