Uygulamamda kaynak sızıntılarını hata ayıklıyordum ve GDI nesne sızıntılarını test etmek için bir test uygulaması oluşturdum. OnPaint'te onları yok etmeden yeni simgeler ve yeni bitmapler oluşturuyorum. Bundan sonra, her durum için görev yöneticisinde GDi nesnelerini kontrol ediyorum. Ancak, uygulamamın ana penceresini yeniden boyamaya devam edersem, simgeler için GDI nesnelerinin sayısı artar, ancak bitmap'ler için herhangi bir değişiklik yoktur. Simgelerin bitmapler ile aynı şekilde temizlenmemesinin özel bir nedeni var mı?Simge ve Bitmap atmada bir fark var mı?
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);
}
}
Test Sonucu:
- Simge yok ve nbspbitmap'lerdir - 30 GDI bitmapler ile
- nesneleri - 31 GDI nesnesi, sayı değişmez.
- Simgelerle - 31 ve sonra pencereyi yeniden boyarsanız sayı artar.
Posible explcation çöp toplama etkisi olmasıdır: 'bitmap genellikle' Icon' iken * büyük * * küçük * çok büyük 'Bitmap's kadar tetikleyebilir Çöp Toplama 'Bitmap' s (ve * onları * atmayın) temizler ama değil 'Simge' –
@DmitryBychenko Yeni oluşturulan küçük nesneler 0 nesline ait olmalı ve daha sık temizlenmelidir? – username
evet, nesil 0 toplanmaya eğilimli; Başka bir sorun ise GC'nin CPU önbellek boyutlarına vb. önem vermesidir, böylece büyük bir nesne çöp toplama işlemini tetikleyebilir. –