Я отлаживал утечки ресурсов в своем приложении и создавал тестовое приложение для тестирования утечек объектов GDI. В OnPaint я создаю новые значки и новые растровые изображения без их удаления. После этого я проверяю увеличение объектов GDi в диспетчере задач для каждого из случаев. Однако, если я перекрашу основное окно моего приложения, количество объектов GDI увеличивается для значков, но изменений для растровых изображений нет. Есть ли какая-то особая причина, почему иконы не очищаются так же, как растровые изображения?Есть ли разница в использовании иконки и растровых изображений?
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// 1. icon increases number of GDI objects used by this app during repaint.
//var icon = Resources.TestIcon;
//e.Graphics.DrawIcon(icon, 0, 0);
// 2. bitmap doesn't seem to have any impact (only 1 GDI object)
//var image = Resources.TestImage;
//e.Graphics.DrawImage(image, 0, 0);
}
}
Результат теста:
- Нет иконки и растровые изображения - 30 GDI объектов
- с растровыми изображениями - 31 объект GDI, число не меняется.
- С помощью значков - 31, а затем число увеличивается, если вы перерисовываете окно.
explcation Возможное, что это сборка мусора эффект: 'Bitmap' обычно * большой * в то время как' Icon' есть * маленький * настолько велик, 'Bitmap's вызвать вверх Мусорная коллекция, которая очищает «Bitmap's (и * dispose * them), но не' Icon ' –
@DmitryBychenko. Должны ли новые созданные небольшие объекты принадлежать генерации 0 и чаще очищаться? – username
да, поколение 0 склонно к сбору; Другая проблема заключается в том, что GC уделяет внимание размерам кэша процессора и т. д., поэтому большой объект может запускать сборку мусора. –