Как быстрее всего нарисовать изображение в Windows.Forms?

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

Одна из оптимизаций, которые я использовал, — преобразование изображения в формат PixelFormat.Format32bppPArgb, который предварительно вычисляет некоторые альфа-каналы.

Есть ли разница в производительности между DrawImage и DrawImageUnscaled?

Ищите реальный опыт, а не документально подтвержденные ожидания.

Обновление: покопавшись в классах фреймворка, я обнаружил, что класс Control использует TextureBrush, используя мозаичное изображение. Это выглядит многообещающе.


person Paul Alexander    schedule 22.05.2009    source источник


Ответы (1)


Если вы хотите p/invoke, BitBlt. Если нет, то DrawImageUnscaled вполне подойдет.

person overslacked    schedule 22.05.2009
comment
DrawImageUnscaled на самом деле масштабирует изображение... как это может быть быстрее, чем DrawImage? - person Paul Alexander; 23.05.2009
comment
У вас это наоборот - DrawImageUnscaled не будет масштабировать изображение, на самом деле нет никаких параметров для управления размером цели (кроме указания размера источника). - person overslacked; 23.05.2009
comment
Да... хотелось бы, чтобы это было правдой. Документы утверждают обратное, и тестирование показывает обратное. Посмотрите на фактический код DrawImageUnscaled, который просто вызывает DrawImage напрямую. - person Paul Alexander; 23.05.2009