[Monkey] extremer Arbeitsspeicher Verbrauch
Übersicht

DukeS87Betreff: extremer Arbeitsspeicher Verbrauch |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey Leute, ich habe gestern angefangen einen kleinen GalleryViewer zu programmieren. Funktioniert auch soweit ganz gut, nur ist mir dabei folgendes Aufgefallen:
(Momentan alles unter GLFW) 1. Wenn ich die Monkeyapp ohne alles starte >> Arbeitsspeicher rund 21mb (gut, das geht ja noch klar), aber Wenn ich im zu suchenden Ordner a) 10 Bilder (insgesamt 3,6mb), alles .jpg habe >> Arbeitsspeicher schon 71mb, bei 20 Files (6,7mb) >> 109mb usw. bei 40 Files dann schon 400mb. 2. Es werden nicht alle der einzulesenden Bilder geladen (er ignoriert einfach welche, gibt es eine obergrenze für die Größe eines Jpg ? Oder woran könnte das liegen?) letztenendes will ich das aufm Android laufen lassen, wobei er mir die gemachten Photo's zeigen soll. das funktioniert auch alles an sich ganz gut. Hauptapp: BlitzMax: [AUSKLAPPEN] #Rem Die ManiacGallery sieht dann so aus: BlitzMax: [AUSKLAPPEN] Class ManiacGallery Implements IOnLoadImageComplete In der ManiacUpdate() wird UpdateAsyncEvents() aufgerufen. Die GetFolderFiles(_Path) liefert mir ein Array mit allen Bilddateiennamen. (auch Alle, selbst die, die nicht geladen werden). Stimmt etwas mit der loadFromPath:Void() , oder OnLoadImageComplete:Void() nicht ? Oder ist das ein normales verhalten? Wenn ihr wollt, schreibe ich das ganze programm auch so um, dass man es ohne mein maniacFramework ausprobieren kann und stelle den Quellcode hier rein. mfG |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klar brauchen die Bilder im Arbeitsspeicher mehr als auf der Platte. Auf der Platte hast du sie als komprimierte JPEGs liegen, da dir dort die Ladezeit wurscht ist, die Speichergröße aber sehr wichtig ist.
Im RAM liegen sie dann entpackt herum (von der Größe her ähnlich zu unkomprimierten BMPs), da es hier wichtig ist, sie schnell zeichnen zu können. Sonst müsste man sie jedes Frame wenn man sie zeichnen will neu entpacken, was irrsinnig lahm wäre. Ich nehme an, du wirst die Vorschaubilder nicht in voller Größe zeigen, da bieten sich also Thumbnails an. Dafür skalierst du das Bild einfach runter und löscht das Original aus dem RAM. Alternativ, wenn du die Bilder in voller Größe zeigst, aber nicht alle gleichzeitig, dann halt nur die im RAM, die du grad anzeigst oder bald anzeigen wirst. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
DukeS87 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke DAK,
Zitat: "Dafür skalierst du das Bild einfach runter und löscht das Original aus dem RAM. " Werde ich mir mal anschauen. Ich nehme mal an, es ist nicht so einfach das ich dann einfach DrawImage img, x,y,0,scaledPxlsW/img.Width(),scaledPxls/img.Height() newImg = GrabImage x,y,scaledPxlsW,scaledPxlsH img.Discard() nutzen kann,oder ? |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Doch, sollte so gehen. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ein Verkleinern geht so, dass Du das Originalbild auf den Bildschirm skaliert malst und dann von Bildschirm wieder grabst.
in etwa so: Code: [AUSKLAPPEN] ....
Original:Image=LoadImage(...) MyImage:Image ..... Method OnRender() .... SetScale 0.5, 0.5 DrawImage Original,0,0 MyImage=ScreenGrab(0, 0, Original.Width()/2, Original.Heighth()/2) ..... End ..... Function ScreenGrab:Image(X%,Y%,Width%,Height%) If X<0 Error "Screen Grab Error" If Y<0 Error "Screen Grab Error" If (X+Width)>DeviceWidth() Error "Screen Grab Error" If (Y+Height)>DeviceHeight() Error "Screen Grab Error" PushMatrix SetMatrix 1,0,0,1,0,0 Local ScreenShot:Image ScreenShot = CreateImage(Width,Height) Local pixels:Int[] =New Int[Width*Height] ReadPixels(pixels, X, Y, Width,Height) ScreenShot.WritePixels(pixels, 0, 0, Width,Height) Return ScreenShot PopMatrix End |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group