Diskuze: WPF - Image žere pamět

C# .NET .NET (C# a Visual Basic) WPF - Image žere pamět American English version English version

Avatar
martinsakra
Redaktor
Avatar
martinsakra:

Zdravim dělám aplikaci ve wpf,ta mi na požádání generuje obrázek v bitmapě z pole "dat". Používám LockedBitmap promaximální výkon. Potuď funguje všechno jak má. Ale tuto bitmpau pak dávám v intervalu 0,2 s jako Source do obrázku (Bitmap >BitmapSource taky funguje), ale čím déle jede aplikace tím víc pozoruji nárust náročnosti na pamět, jako by všechny obrázky které už nepoužívám, se stále drželi v paměti.
Částečně jsem to omzeil tím že BitmapSource jsem upravil na stejnou velikost jako je Image control (na netu jsem našel že to jinak cachuje a zabírá pamět), čím si myslí že jsem pamětovou náročnost snížil,ale i tak roste

BitmapSource bmSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(gameMap.GetWaterImage().GetHbitmap(), IntPtr.Zero, System.Windows.Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
          TransformedBitmap tbBitmap = new TransformedBitmap(bmSource,new ScaleTransform(2,2));

           WaterImage.Source =tbBitmap;

gameMap.GetWa­terImage() vrací bitmapu

Nevíte někdo proč se to děje a jak se tomu vyhnout ... něco jako ručně zahodit obrázek z cache/paměti?

Odpovědět 10.2.2014 10:47
Democracy is two wolves and a lamb voting on what to have for lunch. Liberty is a well-armed lamb contesting the vote.
Avatar
Odpovídá na martinsakra
Luboš Běhounek (Satik):

O using jsi někdy slyšel? :)
http://msdn.microsoft.com/…h598w02.aspx

Případně ručně volat Dispose().

Nahoru Odpovědět 10.2.2014 12:32
:)
Avatar
martinsakra
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
martinsakra:

nemám problém s using, dispose ale co bych měl takhle ošetřit?

 System.Drawing.Bitmap b = gameMap.GetWaterImage();
BitmapSource bmSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(b.GetHbitmap(), IntPtr.Zero, System.Windows.Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
 b.Dispose();

ale to neřeší problém a BitmapSource dispose nemá.

Nahoru Odpovědět 10.2.2014 13:11
Democracy is two wolves and a lamb voting on what to have for lunch. Liberty is a well-armed lamb contesting the vote.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na martinsakra
David Čápka:

Bitmap není z WPF, ale z WF a protože nějak souvisí s GDI, musíš to mít v using. Raději bych použil něco přímo z WPF.

Nahoru Odpovědět  +1 10.2.2014 13:18
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na martinsakra
Luboš Běhounek (Satik):

Jestli dobře vidím, tak tam vždy vytváříš novou bitmapu, nešlo by to nějak upravit na využívání té již vytvořené?

Je možné, že ten nárůst paměti se týká více míst, zkus to třeba ještě trochu projít.

Jinak ještě můžeš zkusit volat ručně GC.Collect(), pokud ti to připadá, že je GC trochu líný při uklízení paměti.

Nahoru Odpovědět 10.2.2014 13:21
:)
Avatar
martinsakra
Redaktor
Avatar
martinsakra:

Vyřešeno chyba nebyla v bitmapě jako takové ale v Bitmap.GetHbit­map(); která děla kopii
mimo jiné řešeno tu http://stackoverflow.com/…-memory-leak

sdraco: jo přemýšlel jsem WriteableBitmap, InteroBitmap se tvářili jako to co bych mohl používat, až bude víc času tak se na ně mrknu, ale zatim mi u obou znich chyběla metoda na urovni setPixel -> resp změna konkrétního jednoho pixelu

Nahoru Odpovědět 10.2.2014 14:09
Democracy is two wolves and a lamb voting on what to have for lunch. Liberty is a well-armed lamb contesting the vote.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.