Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
martinsakra
Tvůrce
Avatar
martinsakra:10.2.2014 10:47

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:10.2.2014 12:32

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
https://www.facebook.com/peasantsandcastles/
Avatar
martinsakra
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
martinsakra:10.2.2014 13:11

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 Hartinger
Vlastník
Avatar
Odpovídá na martinsakra
David Hartinger:10.2.2014 13:18

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
10.2.2014 13:18
You are the greatest project you will ever work on.
Avatar
Odpovídá na martinsakra
Luboš Běhounek Satik:10.2.2014 13:21

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
https://www.facebook.com/peasantsandcastles/
Avatar
martinsakra
Tvůrce
Avatar
martinsakra:10.2.2014 14:09

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.