C # GDI + / System.Drawing.Graphics - создание буфера и блиттинг вручную? - PullRequest
6 голосов
/ 21 марта 2011

Я создаю CAD Viewer, который работает с очень большими файлами изображений, и я пытаюсь оптимизировать его для максимально высокой частоты кадров и минимального объема памяти.

Используется GDI + для рендеринга на панель.

Это текущий недостаток рендеринга изображений. Некоторые из файлов, которые я использую, являются эталонными изображениями, которые являются особенно большими (8000x8000 пикселей). Я оптимизировал использование памяти, загружая их только тогда, когда они становятся видимыми, и избавляясь от них, когда их нет. Это уменьшает вероятность того, что программе не хватит памяти, но предотвращает слишком частую загрузку и выгрузку изображений; однако рендеринг самих изображений (context.DrawImage) все еще несет в себе очень большие накладные расходы.

Сейчас я изучаю способы переноса изображений в некоторый некоторый буфер, рендеринга этого (как правило, гораздо меньшего) буфера, а затем его обновления / восстановления при значительном изменении уровня масштабирования.

Проблема в том, что я не могу найти никакого условия для этого в GDI вообще. Кто-нибудь может подсказать, как мне этого добиться?

Ответы [ 4 ]

2 голосов
/ 21 марта 2011

Если вы создаете новое графическое приложение с высокой частотой кадров и ищете предложения, я предлагаю отказаться от GDI + и использовать WPF.WPF использует аппаратное ускорение и поддерживает графику с сохранением режима;это намного лучше, чем GDI +.

Если есть какие-то ограничения, запрещающие WPF, объясните это в своем вопросе.Это важно, потому что такие ограничения также могут влиять на чертеж GDI +.

2 голосов
/ 21 марта 2011

Я не думаю, что GDI предназначен для таких высокоскоростных обновлений изображений. Если вы пытаетесь прокручивать изображение и отслеживаете мышь при каждом движении, попробуйте сместить участки изображения и заполнить пространство, открытое сдвигом. По существу, повторно используйте приемы, которые программисты использовали при плавной прокрутке / панорамировании графики в то время, когда процессоры работают медленно, а оперативной памяти мало.

0 голосов
/ 26 ноября 2011

Я столкнулся с аналогичной проблемой при разработке собственного ГИС-приложения. Лучшее решение, которое я нашел для этого (даже при использовании WPF), состоит в том, чтобы размещать большие изображения и отображать только видимые части. Говорят, что я бы переключился на WPF не только по причинам, указанным в приведенных выше ответах, но и за хорошую поддержку изображений. См. эту ссылку для получения дополнительной информации

0 голосов
/ 12 мая 2011

GDI Разработан в пользу Direct3D, так как в любом случае 3D-элементы вошли в уравнение. Изображения превращаются в отдельные миниатюры и плитки большего размера, которые загружаются по мере необходимости.

...