Должен ли я создавать новые ручки / кисти для каждого запроса Paint или сохранять их на протяжении всего жизненного цикла приложения

У меня есть приложение, которое выполняет лот рисования, давайте представим, что это Viso- как приложение. У него есть объекты, которые имеют несколько подобъектов, которые нарисованы, вещи можно связать, изменить их размер и т. д. В настоящее время, когда я вызываю рисование для определенного подобъекта или объекта, я делаю следующее:

using(var pen = new Pen(this.ForeColor))
{
    // Paint for this object.
}

Я прочитал противоречивые ответы, что это должно быть сделано для приложения, которое постоянно рисует одно и то же вещь (может быть просто изменен, перемещен и т. д.). Должен ли я хранить Pen / Brush вместе с объектом и затем утилизировать их все, когда приложение удаляется, или они достаточно эффективны, чтобы их можно было создавать / удалять для каждого вызова краски (запоминание что это довольно интенсивные графические приложения).

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

16
задан TheCloudlessSky 20 August 2010 в 16:51
поделиться

4 ответа

Конечно, вы можете использовать классы Pens и Brushes, которые предоставляют вам объекты, уже созданные средой выполнения.

Например, если вам нужен один из стандартных цветов Перья , вы можете сделать это:

var pen = Pens.Red;

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

var brush = Brushes.Red

Используя их, вам не нужно беспокоиться об их очистке, утилизации или иным образом.

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

РЕДАКТИРОВАТЬ:

Создание и удаление массива из 100 000 новых перьев заняло примерно полсекунды на моем старом старом компьютере XP с запуском тестового приложения в режиме отладки.

Это составляет примерно 5 микросекунд на перо . Только вы можете решить, достаточно ли этого для вас. Рискну предположить, что это время может быть в значительной степени несущественным для остальных ваших операций.

9
ответ дан 30 November 2019 в 22:55
поделиться

Вы узнаете о влиянии на производительность только при тестировании вашего конкретного приложения, но у фреймворка, похоже, нет проблем с хранением нескольких ручек на протяжении всего жизненного цикла приложения. При первом вызове Pens.Black он создает черную ручку и кэширует ее. Вы получаете тот же объект обратно для будущих вызовов, и он никогда явно не удаляется (Pens.Black.Dispose () фактически вызовет исключение). Однако вы не хотите слепо создавать перья и оставлять их для удаления после завершения приложения, потому что это приведет к утечке неуправляемой памяти. На ум приходят несколько вариантов в зависимости от модели использования в вашем приложении.

Дайте каждому объекту личное перо, которое создается при установке ForeColor и повторно используется для всего рисования. Вы должны сделать свой объект IDisposable, чтобы он мог правильно избавляться от Pen.

Если вы используете относительно небольшое количество различных цветов, но многие объекты используют каждый цвет, вы можете не захотеть, чтобы каждый объект держался за свое собственное перо. Создайте некоторый класс кеша, который хранит Dictionary и передает их через PenCache.GetPen (ForeColor) . Как и в случае использования Pens.Black, теперь вы можете забыть об их утилизации. Проблема возникает, если вы используете цвет ненадолго, а потом он больше не нужен. Ручка была кэширована, так что вы навсегда застряли в ней в памяти. Вместо этого вы можете сохранить Dictionary > , позволяя кэшированным перьям в конечном итоге собирать мусор, если они больше не нужны.

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

3
ответ дан 30 November 2019 в 22:55
поделиться

Повторное использование одних и тех же Pen и Brush в операциях, которые потребуют этого многократно, будет намного быстрее, чем их удаление каждый раз с с использованием .

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

2
ответ дан 30 November 2019 в 22:55
поделиться

Да, лучше всего протестировать, как предлагает @fantius, вы, вероятно, обнаружите, что это не имеет значения - хотя я бы поостерегся держать их открытыми, поскольку, если я правильно помню, они являются неуправляемыми ресурсами и могут использовать вашу память. Если бы вы создавали их каждый раз заново, вам нужно было бы особенно тщательно следить за их правильной утилизацией, чтобы избежать утечек памяти.

0
ответ дан 30 November 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: