Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET
Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 80% výuky zdarma!
https://www.itnetwork.cz/csharp
Avatar
martinsakra
Redaktor
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
Luboš Běhounek Satik
Autoredaktor
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
Redaktor
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.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na martinsakra
David Čápka: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
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Luboš Běhounek Satik
Autoredaktor
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
Redaktor
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.