none
Bellek kullanımındaki problem

    Soru

  •                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
    01 Haziran 2012 Cuma 07:53

Yanıtlar

  • 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!

    04 Haziran 2012 Pazartesi 09:10
    Moderatör

Tüm Yanıtlar

  • GC 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
    MCC

    01 Haziran 2012 Cuma 08:17
    Moderatör
  •           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 08:56
  • sabahtan beri uğraşıyorum olmuyor yav çözümü yokmu bunun acep
    01 Haziran 2012 Cuma 15:56
  • 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!

    04 Haziran 2012 Pazartesi 09:10
    Moderatör
  • teşekkür ettim gayet güzel çalışıyor ellerine sağlık ;)
    16 Haziran 2012 Cumartesi 20:39