2012-02-14 2 views
0

У меня есть приложение winforms, разработанное на C#, которое включает в себя много рисунков на экране. Картина включает визуализацию пользовательских элементов управления и других 2D-объектов. Теперь проблема заключается в том, что для рисования всего экрана требуется около 4-5 секунд. Я оптимизировал код до уровня, где все необходимые данные были доступны в самой памяти, а не для чтения с диска или сети.Использование вызовов Win32 API через классы .NET GDI

Для дальнейшего сократить время рендеринга я планировал пойти на следующие варианты

  1. вызовов непосредственно GDI функции выставленного WIN32API, вместо того, чтобы использовать классы GDI, предоставляемые .NET

  2. Используйте DirectX, поскольку я слышал, что он очень эффективен при рендеринге. В моем приложении нет какого-либо 3D-рендеринга.

Пожалуйста, помогите мне решить, какой вариант пойти? существуют ли какие-либо другие параметры, например, любые высокопроизводительные сторонние компоненты или библиотеки.

+0

Сколько у вас органов управления? Сотни? –

+0

@ HansPassant: около 5K до 7K управляет – AbrahamJP

+1

Ничего себе, это поражает всего 7 секунд. Вам придется сократить это примерно до 100 или около того. –

ответ

1

Из личного опыта:

  • GDI + только медленнее, чем GDI с коэффициентом < 2. Это не поможет перейти от .NET (который использует GDI +) к чистому ВВД.

  • Direct2D так же медленно, как и GDI - по крайней мере, для рисования основных фигур. Поэтому, если вы делаете что-то намного сложнее, это, вероятно, не поможет.

Ваш лучший выбор - это, вероятно, сократить чертеж и удвоить буфер.

Если это не сработает, вы, вероятно, захотите сгенерировать растровое изображение в памяти (используя byte[] или что-то, избегая полностью графических API), и просто просто (скопировать) его прямо на экран. Это сложно, но он почти всегда оказывается самым быстрым.

+0

Спасибо за ваш вклад, пожалуйста, дайте мне знать, было бы разумно пойти на прямые вызовы win32 api, потому что я чувствую, что могу пропустить некоторые слои .NET, которые могут улучшить производительность на миллисекунды. – AbrahamJP

+0

@AbrahamJP: Как я уже упоминал, он может сбрить максимум два или два, но это все равно будет неудовлетворительным. – Mehrdad

 Смежные вопросы

  • Нет связанных вопросов^_^