Bellek kullanımındaki problem
-
01 Haziran 2012 Cuma 07:53
private void Ciz() { int width = Screen.PrimaryScreen.Bounds.Width; int height = Screen.PrimaryScreen.Bounds.Height; Bitmap resim = new Bitmap(width, height); Graphics gr = Graphics.FromImage(resim); gr.CopyFromScreen(0, 0, 0, 0, new Size(width, height)); Random rnd = new Random(); gr.DrawEllipse(new Pen(Color.Red, rnd.Next(100)), rnd.Next(300), rnd.Next(100), rnd.Next(600), rnd.Next(1000)); Point[] p = new Point[3]; p[0] = new Point(rnd.Next(30), rnd.Next(60)); p[1] = new Point(rnd.Next(100), rnd.Next(260)); p[2] = new Point(rnd.Next(30), rnd.Next(10)); gr.DrawPolygon(Pens.AliceBlue, p); pcResimKutusu.Image = resim;}
Ciz metodu timer nesnesi tarafından her 300milisaniyede çağrılıyor.Herşey normal ancak her 300milisaniyede projenin bellek miktarı
artıyor.Burda metod private tanımlanmış neden herseferinde yeni değerler oluşturulup eski değerler kaldırılmıyor acaba sorunu garbage collector ilemi çözecem?
- Düzenleyen Mustafa06 01 Haziran 2012 Cuma 07:54
Tüm Yanıtlar
-
01 Haziran 2012 Cuma 08:17ModeratörGC nin silebildiğinden daha hızlı instance oluşuyor. Ciz methodu içindeki çizim işlerini yapan Classların instance larını using içinde deklare ediniz. yada işi bitince Dispose() methodlarını çağırınız.
e-mail: onay[nokta]yalciner[at]hotmail[nokta]com


-
01 Haziran 2012 Cuma 08:56
private void Ciz() { int width = Screen.PrimaryScreen.Bounds.Width; int height = Screen.PrimaryScreen.Bounds.Height; using (Graphics gr = Graphics.FromImage(resim)) { Bitmap resim = new Bitmap(width, height); gr.CopyFromScreen(0, 0, 0, 0, new Size(width, height)); Random rnd = new Random(); gr.DrawEllipse(new Pen(Color.Red, rnd.Next(100)), rnd.Next(300), rnd.Next(100), rnd.Next(600), rnd.Next(1000)); Point[] p = new Point[3]; p[0] = new Point(rnd.Next(30), rnd.Next(60)); p[1] = new Point(rnd.Next(100), rnd.Next(260)); p[2] = new Point(rnd.Next(30), rnd.Next(10)); gr.DrawPolygon(Pens.AliceBlue, p); pcResimKutusu.Image = resim; } }using içine aldım ama yine aynı problem devam ediyor, gr.Dispose(); ve resim.Dispose(); yaptım görüntü gelmiyor bu sefer -
01 Haziran 2012 Cuma 15:56sabahtan beri uğraşıyorum olmuyor yav çözümü yokmu bunun acep
-
04 Haziran 2012 Pazartesi 09:10Moderatör
Mustafa selam,
int width = Screen.PrimaryScreen.Bounds.Width; int height = Screen.PrimaryScreen.Bounds.Height; Bitmap resim ; private void Ciz() { if (resim == null) { resim = new Bitmap(width, height); } using (Graphics gr = Graphics.FromImage(resim)) { gr.CopyFromScreen(0, 0, 0, 0, new Size(width, height)); Random rnd = new Random(); gr.DrawEllipse(new Pen(Color.Red, rnd.Next(100)), rnd.Next(300), rnd.Next(100), rnd.Next(600), rnd.Next(1000)); Point[] p = new Point[3]; p[0] = new Point(rnd.Next(30), rnd.Next(60)); p[1] = new Point(rnd.Next(100), rnd.Next(260)); p[2] = new Point(rnd.Next(30), rnd.Next(10)); gr.DrawPolygon(Pens.AliceBlue, p); } pcResimKutusu.Image = resim; }
Yukarıdaki gibi dener misin? Bu şekilde oluşturulan graphics nesnelerin dispose edilmiş oluyor ve asıl performans kazancını her 300ms te bir yeni bir bitmap oluşturmayarak elde ediyoruz. Bu şekilde test ettim,bellek kullanımı eski duruma nazaran çok çok cüzi bir oranda artıp GC nin de bir süre sonra devreye girmesiyle sabitleniyor.
Deneyip geri dönüşte bulunursanız çok sevinirim.
İyi çalışmalar.
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
- Yanıt Olarak Öneren Emre ArasModerator 05 Haziran 2012 Salı 07:38
- Yanıt Olarak İşaretleyen Emre GunerturkModerator 08 Haziran 2012 Cuma 07:33
-
16 Haziran 2012 Cumartesi 20:39teşekkür ettim gayet güzel çalışıyor ellerine sağlık ;)