Должна ли функция, которая периодически возвращает растровые изображения, повторно использовать их? - PullRequest
0 голосов
/ 21 июля 2010

У меня есть функция, которая возвращает bitmap, предназначенную для использования в качестве фона на панели, и иногда мне приходится вызывать ее, чтобы создать новый фон на основе параметров.

(Поскольку для этой панели есть две функции рисования (фон не нужно менять так же часто, как передний план), это не просто рисование события Paint.)

Итак, мой вопрос: Есть ли (более чем символическое) повышение производительности, если я получу старый фоновый буфер в качестве параметра и буду рисовать его вместо создания нового растрового изображения каждый раз, когда вызывается функция

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

Да, воссоздание растрового изображения в коде, который выполняется во время рисования, обычно слишком дорого и слишком сильно замедляет рисование.Сохранение копии растрового изображения решает проблему скорости, требуя дополнительной памяти.

Обратите внимание, что для этого доступно стандартное свойство Control.BackgroundImage, рассмотрите возможность его использования.Вам просто нужно добавить код, который обновляет это свойство (и вызывает Invalidate) при изменении условий, которые требуют другого фонового изображения.Рисование выполняется автоматически.

Вторичные соображения эффективности заключаются в предварительном масштабировании растрового изображения для точного соответствия его размеру ClientSize, что позволяет избежать масштабирования растрового изображения во время рисования.Большая экономия там, особенно когда растровое изображение велико.Но требует переопределения метода OnResize, чтобы вы могли заново сгенерировать масштабированное растровое изображение.Когда это слишком сильно замедляет рисование при изменении размера формы, вам нужно подключить событие ResizeEnd формы.

И, создавая растровое изображение в пиксельном формате Format32bppPArgb, он отрисовывается примерно в 10 раз быстрее на большинстве видеоадаптеров по сравнению слюбой другой формат.

2 голосов
/ 21 июля 2010

Да, вы получите совсем немного, я бы вообразил.

С одной стороны, ваши ограничения памяти будут лучше ограничены. Если вы постоянно создаете растровые изображения, что мешает вашему клиентскому коду удерживать их и вытеснять из памяти?

Распределение обычно является одной из самых дорогих вещей в любой большой системе. Повторное использование - определенно хорошая вещь для дорогих в создании объектов. Вы также увидите меньше икоты из «Сборщика мусора».

РЕДАКТИРОВАТЬ вы также можете рассмотреть возможность сохранения своего собственного пула растровых изображений и не требовать от вызывающего абонента передачи существующего. Убедитесь, что вы документируете, что являетесь владельцем растровых изображений и что вызывающая сторона должна рассматривать их как доступные только для чтения (можете ли вы обернуть их в некоторый неизменный объект?). Таким образом, вы можете создавать / распоряжаться в свое время и не нуждаться ни в чем от клиента.

...