Memory Leak ..

Status
Niet open voor verdere reacties.

svexo

Gebruiker
Lid geworden
10 mei 2011
Berichten
5
Hey, ik heb een probleem als ik myn prog run krijg ik de exception Out of Memory. (na een tijdje)

Dit Is mijn Code:
Code:
        public Bitmap ScreenShot()
        {
            Bitmap screenShotBMP = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
           
            Graphics screenShotGraphics = Graphics.FromImage(screenShotBMP);

            screenShotGraphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size,
                CopyPixelOperation.SourceCopy);

            screenShotGraphics.Dispose();

            return ResizeBitmap(screenShotBMP, pictureBox1.Size.Width, pictureBox1.Size.Height);
        }
        public Bitmap ResizeBitmap(Bitmap b, int nWidth, int nHeight)
        {
            Bitmap result  = new Bitmap(nWidth, nHeight);
            Graphics g = Graphics.FromImage((Image)result);
                g.DrawImage(b, 0, 0, nWidth, nHeight);
                g.Dispose();
           
            return result;
        }
Deze Code Herhaalt zicht zelf om de 1 ms met een timer

Bedoeling is om een VidStream van myn desktop te krijgen

Alvast Bedankt , Svexo
 
Ik zie niet echt waar een leak kan zitten maar is het niet overkill om elke 1 millisec een screenshot te maken ?

30 fps ofzo zou toch ruim voldoende moeten zijn ?
probeer het eens, misschien werkt het.
 
Laatst bewerkt:
Inderdaad wat Westerland zegt.

1000 screenshots per seconde is ten eerste praktisch gezien onmogelijk voor computers.
Ten 2e 1000 screenshots per seconde is meer dan je zelf merkt. Een menselijk oog ziet maar 30 fps (frames per second: beeldjes per seconde), dus meer dan 30 heb je er niet nodig. Tegenwoordig hanteren veel spellen 60 fps om het "smoother" te laten verlopen.

Waarschijnlijk onthoud je al de screenshots om ze later om te zetten in een filmpje, in de andere code. Je moet de screenshots dus wegschrijven naar je schijf.

Als je niet al die screenshots onthoudt moet je proberen de garbage collection aan te spreken:
http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

Dat doe je dan met deze "method".
GC.Collect();
http://msdn.microsoft.com/en-us/library/xe0c2357.aspx
 
Laatst bewerkt:
Hey,

je hebt geen memory leak, maar zoals wicherh zegt is het probleem de garbage collector.
De garbage collector voert zijn werk uit als het programma niks te doen heeft of na x aantal seconde.

In beide methodes maak je een nieuwe bitmap aan, wat erg veel geheugen kost.
Een oplossing is niet door de Garbage collector zijn werk te laten doen, maar zelf de Dispose() aanroepen van de bitmaps die je niet meer gebruikt.
In de methode ScreenShot() geeft je op de laatste regel een aanroep naar ResizeBitmap die vervolgens weer een nieuwe bitmap aanmaakt. Maar wat doe je met die variabele screenShotBMP?
Deze bestaat nog in het geheugen, en moet verwijderd worden met de Dispose().
Dus:
Code:
return ResizeBitmap(screenShotBMP, pictureBox1.Size.Width, pictureBox1.Size.Height);
Wordt:
Code:
var resizedBitmap = ResizeBitmap(screenShotBMP, pictureBox1.Size.Width, pictureBox1.Size.Height);
screenShotBMP.Dispose();
return resizedBitmap;

Dat is één probleem weg, maar nu die andere ook... Dus die bitmap die met de ResizeBitmap() wordt aangemaakt. Deze kun je in de klassen opslaan en Dispose ervan aanroepen bij de volgende timer tick. Natuurlijk zijn er ook andere manieren om die te Disposen...
Ik denk als je de GC.Collect() aanroept, dat er veel performance verloren gaat mits je deze methodes zeer vaak wil aanroepen.

Succes,
Mathijs
 
Bedankt voor alle reacties :) ,
ik heb de inverval van de timer verhoogd (30 FPS)
en de code aangepast.
De exception is nu weg :)

- Svexo
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan