Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Učitavanje slike i veliko zauzeće memorije

[es] :: .NET :: Učitavanje slike i veliko zauzeće memorije

[ Pregleda: 2699 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Laki123

Član broj: 16706
Poruke: 98
*.adsl-a-1.sezampro.yu.



+4 Profil

icon Učitavanje slike i veliko zauzeće memorije05.01.2009. u 17:49 - pre 186 meseci
U programu učitavam jednu veliku sliku, iz koje treba da isečem manju, i tu manju sliku treba da prikažem u picture box.
Velika slika se nalazi u resource, a ta velika je zapravo sastavljena od puno malih slika. Imam funkciju koja izračunava položaj malih slika na toj velikoj.
Da bi pojednostavio umesto funkcije koja računa položaj male slike stavio sam samo new Rectangle(50,50,150,100).

Ovaj deo je u Load delu forme:
Code:
Bitmap SlikaResurs = new Bitmap((Image)Resource1.ResourceManager.GetObject("VelikaSlika")); //to je velika slika iz resursa


Ovaj deo se koristi svaki put kad treba da se crta mala slika:
Code:
Bitmap manjaSlika = SlikaResurs.Clone(new Rectangle(50,50,150,100), SlikaResurs.PixelFormat); //pravimo malu sliku dimenzija 150x100 piksela
pictureBox1.Image = manjaSlika; //prikaz slike


Problem je u sledećem, kada se učita velika slika, zauzeće memorije skoči sa početnih 20ak, duplo tj. na 40-50 MB.
S obzirom da se crtanje često obavlja, ukoliko bih svaki put kreirao novu veliku sliku (SlikaResurs), pa je onda uništavao zbog uštede u memoriji, crtanje bi bilo jako sporo.
U čemu je greška? Kako bi bilo pravilno ovo uraditi?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije05.01.2009. u 23:56 - pre 186 meseci
Nema tu mnogo spasa, moras da ucitas sliku iz resursa kao sto to radis, resurs je samo kvazi filesystem iz kojeg ucitavas fajl, ne moze se direktno raditi manipulacija nad tim bufferom. Verovatno je i neka kompresija primenjena pa se pri dekompresiji naduva tih 30ak mb. E sad, posto prosecan PC danas ima 1Gb+ RAM-a, zasto je sve ovo problem?
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije06.01.2009. u 00:38 - pre 186 meseci
Citat:
Laki123: Problem je u sledećem, kada se učita velika slika, zauzeće memorije skoči sa početnih 20ak, duplo tj. na 40-50 MB.
S obzirom da se crtanje često obavlja, ukoliko bih svaki put kreirao novu veliku sliku (SlikaResurs), pa je onda uništavao zbog uštede u memoriji, crtanje bi bilo jako sporo.
U čemu je greška? Kako bi bilo pravilno ovo uraditi?

Pa i nemoj kreirati svaki put novu veliku sliku ako je uvek ista. Kreiraj je na pocetku i onda izvlaci slicice po potrebi. 50MB uopste nije problem, a kada bi stalno kreirao novu, desavalo bi ti se da ode i na nekoliko stotina MB pre nego sto se Garbage Collector smiluje da pocisti memoriju (upravo mi se to desavalo jednom, s' tim da sam morao ucitavati iznova jer je bila drugacija slika).
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije06.01.2009. u 00:42 - pre 186 meseci
Pa on to i radi, njega zulja sto je bitmap napravio novu kopiju slike na heap-u umesto da radi direktno sa podacima iz resursa koji su vec u memoriji (ako sam ja prokapirao dobro).
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Laki123

Član broj: 16706
Poruke: 98
*.adsl-a-1.sezampro.yu.



+4 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije06.01.2009. u 18:00 - pre 186 meseci
Da, tako radim, na početku učitam sliku iz resursa, i zauzme solidno memorije, problem mi je što je u pitanju sitna igra sa kartama i po meni je nedopustivo da zauzima tako puno memorije, ali tačno je da je danas standard nekih 1gb, a siguran sam da niko neće ni primetiti koliko je rama zauzeto
U svakom slučaju hvala na odgovorima.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12851



+4784 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije06.01.2009. u 19:07 - pre 186 meseci
Znam da tako radi i htedoh reci "ne menjaj" samo sam dodatno i objasnio zasto :)
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
94.189.245.*



+7 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije09.01.2009. u 20:41 - pre 186 meseci
Sta te sprecava da koristis mnogo manjih slika umesto jedne velike ? I u kojem formatu je ta velika slika ?
By the way ... nije dobar izgovor da danas ima mnogo rama, sta bi radio da pravis neku zahtevniju igru ...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije09.01.2009. u 21:29 - pre 186 meseci
Pa za pocetka ne bi ucitavao slike is resursa niti koristio GDI za to.
Al kad smo vec tu u principu ovde nece biti neke velike ustede jer ce sve to ionako da ode na unmanaged heap samo ce ucitavanje da traje duze jer ce decoder morati da se pokrene 52 puta za svaku kartu dok ce sa isecanjem biti jedan decode i 52 mem bitblt operacije.

Izgovor je dobar, brojanje bajtova je bilo in pre deset godina a cak ni tad se ne bi mnogo zabrinuo za ekstra iskoriscenih 20Mb koji nisu leak i koji ce posle isecanja i Dipose() a biti trenutno dealocirani posto su na unmanaged heap-u. Postoji granica do koje je razumno optimizovati i sebi komplikovati zivot.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
94.189.245.*



+7 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije10.01.2009. u 00:21 - pre 186 meseci
Ma da :) ... koji izgovor je dobar :) Pa i sam je postavio pitanje zato sto mu je smetao kako program radi.
A i ne broji covek bajtove nego MB
Sta bi bilo da svi imamo takav stav , nebi nam bilo dosta ni 100 GB rama.
Evo bas gledam TaskManager da vidim koliko trenutno trosim rama ... oko 100 MB (5-6 userland aplikacija ukljucujuci Operu koja je zauzala 80 MB)
40-50 MB rama za jednostavnu igru ... mnogo
Slazem se, postoji granica do koje treba optimizovati ali postoji i granica do koje ne treba :)
Ako je slika obicna bmp i ako je na HD-u moze da se ocita i da se izdvoje manje slike bez ekstra utrosene memorije ...

 
Odgovor na temu

Laki123

Član broj: 16706
Poruke: 98
*.adsl-a-1.sezampro.yu.



+4 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije10.01.2009. u 09:57 - pre 186 meseci
Citat:
Eurora3D Team: Sta te sprecava da koristis mnogo manjih slika umesto jedne velike ? I u kojem formatu je ta velika slika ?
By the way ... nije dobar izgovor da danas ima mnogo rama, sta bi radio da pravis neku zahtevniju igru ...


Imam samo tu jednu sliku u kojoj su karte, 2196 x 1492 piksela i 24BPP, pošto već imam funkciju koja pravi okvir za svaku kartu, razmišljao sam da isečem sve sličice iz te velike slike, snimim ih kao male slike i te male slike unesem u resurs umesto jedne velike, program bi naravno pozivao samo one slike koje mu trebaju tj. ne bih imao niz od 52 bitmap, na taj način program bi zauzimao mnogo manje memorije pošto ne bi učitavao veliku sliku.

Citat:
Eurora3D Team: Ako je slika obicna bmp i ako je na HD-u moze da se ocita i da se izdvoje manje slike bez ekstra utrosene memorije ...


Ovaj drugi način bi bio spor, pošto bi za svaku sličicu učitavao celu sliku, ili bih imao niz od 52 bitmape, ali ne znam koliko bi ovo zauzelo memorije?

Trenutan način kako radim je sledeći. Na početku učitam veliku sliku iz resursa, deo koji služi za isecanje i crtanje manjih slika je posebna klasa. Ta klasa ima metod koji vraća tu malu sliku. Znači tu veliku sliku prosleđujem u tu drugu klasu, a ona vrati malu sliku, koju prikazujem u picture boxu.
Kao što rekoh čini mi se da bi jedini način bio da isečem tu veliku sliku na manje delove snimim ih kao posebne slike i onda ih koristim u resursu.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije10.01.2009. u 12:34 - pre 186 meseci
Citat:
Evo bas gledam TaskManager da vidim koliko trenutno trosim rama ... oko 100 MB (5-6 userland aplikacija ukljucujuci Operu koja je zauzala 80 MB)
40-50 MB rama za jednostavnu igru ... mnogo


E onda tu igricu treba praviti u C++-u gde mozes da ostvaris direktnu kontrolu nad working set-om, u .NET ne mozes direktno iz managed code-a. A inace to sto vidis iz task manager-a je slaba indikacija potrosnje memorije posto je to ceo working set (ako nemas vistu a po potpisu mi deluje da nemas) koji ukljucuje i shared working set (npr adresni prostor u koji je ucitan user32.dll je deljen), pravo zauzece je zapravo private working set, a to je vrednost koju ne mozes da dobijes kroz task manager, treba ti npr sysinternals process explorer, pa kad ti on pokaze koliko u stvari imas skrivenih procesa i koliki su working setovi videces da 40-50 MB zaista ne cini nikakvu razliku, sve i da zauzece jeste 40-50Mb a nije zbog nacina na koji .NET barata memorijom.

A sad, njegova velika slika ima tacno 12.5Mb sirovih podataka, toliko ce imati i zbir 52 karte koje isece iz velike slike ili ucita pojedinacno, te slike ne mogu da lebde negde izmedju IO-a i memorije ili su ucitane ili nisu i ako disposujes veliku sliku nakon isecanja memory footprint MORA da bude isti, jedino sto si vise koristio file IO i/ili dekoder overhead da ucitas pojedinacne karte. Ali sve to je nevazno u poredjenju ova dva pristupa zato sto se oba svode na O(1) algoritam i desavaju se samo jednom na pocetku aplikacije.
Jedini nacin da sprecis uvecanje private working set-a je da ili ne koristis hidef hicolor slike i smanjis footprint ili da ucitavas sliku po sliku on demand i da ih po upotrebi dealociras, sto je veoma lose resenje jer minimum moras u GDI-u da drzis zive handlove za one karte koje se vide na radnoj povrsini, da ne pominjem udar na performanse jer bi zapravo stedeo na jeftinom resursu (memorija) tako sto bi koristio skup resurs (file IO) cija upotreba je sad po algoritmu koji je sigurno veci od O(1).

Ja ne znam zasto se ljudi toliko naprezu oko ovh memorijskih "problema" sa .NETom i kao indikator stalno pominju task manager. .NET ce uzeti memorije koliko mu treba da formira optimalni working set i dok god na sistemu ima dovoljno RAM-a NECE vratiti memoriju OS-u, sta vise kad ima bas puno RAM-a verovatno se ni Gen2/LOH collect nece desiti nikad (zbog cega je vazno disposeovati disposable objekte) i samim tim ce Gen2 objekti sa GDI handlovima drzati i unmanaged heap zakljucan jer OS nema potrebe da shrinkuje aktivne procese (sto bi uteralo .NT proces u Gen2 collect i finalizaciju mrtvih Gen2 objekata). Ako bas hoces da vidis kako izgleda barebone working set za tvoju aplikaciju pokreni neki memory compressor i shrinkuj proces i za .NET aplikacije u idle rezimu ces videti drasticno smanjenje. Ali ces onda videti i drasticno usporenje kad .NET krene da ponovo alocira svoj optimalni working set kad krenes da koristis aplikaciju.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
94.189.245.*



+7 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije10.01.2009. u 14:31 - pre 186 meseci
TaskManager sam uzeo kao referencu zato sto se taj program uglavnom koristi (poznat je svima) a verovatno je i Laki123 uzeo podatke tako ...
Setio sam se neceg vezano za ovu temu ...
MS je u nekom starom c kodu (primeru) za neku igru sa kartama koristio sledecu tehniku.
Prvo napravili su 'veliku' bmp ali su stavili samo znakove (herc, pik ... itd.) i brojeve za karte od 1 do 10 i napravili su kod za iscrtavanje (pravljenje slike) karate. Drugim recima iskoristili su cinjenicu da karte od 1 do 10 mogu da se dinamicki kreiraju. Slicno i za ove preko 10 , samo sto su imali i vece slike za centralni deo karte ... Koliko se secam ta velika slika se isto ucitavala iz resursa ali je sve zajedno utroseno mnogo manje memorije a i radilo je prilicno brzo (ne zato sto je c kod).
E sad koliko je ovo komlikovano za tebe i dali ti se isplati da uradis tako ...
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
89.216.103.*



+7 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije15.01.2009. u 00:08 - pre 185 meseci
@Laki123
Ako nisi vec uradio tu igru probaj ovo http://www.eurora3d.com/es/SpilKarata.zip
Ako jesi mozda ce da treba nekom tako da je ostavljam na serveru.
Ovu klasu karta sam napravio u slobodno vreme ... zanimalo me je to sa memorijojom :)
Ispada da je kod tebe najveca greska velicina slike.
Moja slika (velika) je bmp od 44k (160x446) a katre su velicine 73x97 (oko 21k). Kad bi se drzale u memoriji to bi bilo oko 1.2MB (52 karte)
Net program koji koristi klasu i sliku trosi oko 7.5MB pre nego sto ih isctra i oko 11.5MB kad ih iscrta. Ja ih ne drzim u memoriji u nizu nego se samo iscrtavaju na formi , mada bi moglo da se izracuna koliko bi zadrzale rama.
Da i najvaznije karte se isctravaju , nisu snimljene cele ... pogledaj sliku ...
poz



[Ovu poruku je menjao Eurora3D Team dana 15.01.2009. u 13:01 GMT+1]
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: Učitavanje slike i veliko zauzeće memorije15.01.2009. u 10:17 - pre 185 meseci
Citat:
Laki123
Kao što rekoh čini mi se da bi jedini način bio da isečem tu veliku sliku na manje delove snimim ih kao posebne slike i onda ih koristim u resursu.

Upravo .. snimi sve karte pojedinacno u resurs i smanji rezoluciju koliko god je moguce , pa ih citaj posle na zahtev .
Tvoj problem je i nastao jer si baratao sa tolikom bitmap-om (2196 x 1492 X 24 bpp) tj. crop velike slike da bi dobio pojedinacnu kartu .

Viva lollapalooza
 
Odgovor na temu

[es] :: .NET :: Učitavanje slike i veliko zauzeće memorije

[ Pregleda: 2699 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.