[Monkey] extremer Arbeitsspeicher Verbrauch

Übersicht Andere Programmiersprachen Allgemein

Neue Antwort erstellen

 

DukeS87

Betreff: extremer Arbeitsspeicher Verbrauch

BeitragDi, Feb 24, 2015 10:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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
This Example shows how To use the GalleryViewer.
#End

Import mojo
Import maniac

#GLFW_USE_MINGW=True

#GLFW_WINDOW_TITLE="GalleryViewer Example"
#GLFW_WINDOW_WIDTH=1024
#GLFW_WINDOW_HEIGHT=800
#GLFW_WINDOW_SAMPLES=0
#GLFW_WINDOW_DECORATED=False
#GLFW_WINDOW_RESIZABLE=False
#GLFW_WINDOW_FULLSCREEN=False

#GLFW_SWAP_INTERVAL=-1

#OPENGL_GLES20_ENABLED=False
#OPENGL_DEPTH_BUFFER_ENABLED=False

#MOJO_AUTO_SUSPEND_ENABLED=True
#MOJO_IMAGE_FILTERING_ENABLED=True

#TEXT_FILES="*.txt|*.xml|*.json"
#IMAGE_FILES="*.png|*.jpg"
#SOUND_FILES="*.wav|*.ogg"
#MUSIC_FILES="*.wav|*.ogg"
#BINARY_FILES="*.bin|*.dat"

Function Main:Int()
New Example
Return 0
End

Class Example Extends App
Field gv:ManiacGallery

Method OnCreate:Int()
SetUpdateRate( 60 )
initManiac()
gv = New ManiacGallery(DW*0.1,DH*0.1,DW*0.8,DH*0.7,"monkey://data/GFX/Test/")
End Method

Method OnUpdate:Int()
maniacUpdate()
gv.Update()
End Method

Method OnRender:Int()
Cls
gv.Draw()
End Method

End Class


Die ManiacGallery sieht dann so aus:
BlitzMax: [AUSKLAPPEN]
Class ManiacGallery	Implements IOnLoadImageComplete
Global loadedImages:Int = 0
Global l:Int = 0

Field arrImg:Image[500]
Field maniacID:Int
Field X:Float,Y:Float,Width:Float,Height:Float
Field ViewMode:Int = 1
Field dist:Int = 10
Field imgW:Float,imgH:Float
Field BtnRight:ManiacButton
Field BtnLeft:ManiacButton
Field BtnSwitchViewStyle:ManiacButton
Field ScrolledImages:Int = 0
Field tp:Int = 0
Field lastSwitch:Int
Field switchIntervall:Int = 500
Field Alpha:Float

Method New(_X:Float,_Y:Float,_Width:Float,_Height:Float,_loadPath:String = "GFX/")
X = _X
Y = _Y
Width =_Width
Height = _Height
loadFromPath(_loadPath)
Local bW:Float = DW*0.15
Local bH:Float = DH*0.07
imgW = ll_Width(_Width,3,dist)
imgH = (_Height-bH)/2.5
BtnLeft = New ManiacButton(_X + bW/2 + _Width*0.02 ,_Y+_Height-bH/2, bW, bH," << ",ALIGNMENT_MIDDLE,COLOR_BLUE,True,1.5)
BtnRight = New ManiacButton(_X + _Width - bW/2 - _Width*0.02 ,_Y+_Height-bH/2, bW, bH," >> ",ALIGNMENT_MIDDLE,COLOR_BLUE,True,1.5)
BtnSwitchViewStyle = New ManiacButton(_X + _Width*0.5 ,_Y+_Height-bH/2, bW, bH," Switch ",ALIGNMENT_MIDDLE,COLOR_BLUE,True,1.5)

End Method


Method loadFromPath:Void(_Path:String="monkey://external/" )
Print "Get Folder"
Local arrStr:String[] = GetFolderFiles(_Path)
Print "Found: " + arrStr.Length() + " files"
l = arrStr.Length()

For Local ls:Int = 0 Until l
Print "load " + ls
LoadImageAsync(arrStr[ls], 1, 0, Self)
Next
End Method

Method Draw()
Drw_Rect(X,Y,Width,Height,3)
SetColor 255,255,255
SetAlpha 1
Select ViewMode
Case 0 '3x2 overview
Local i:Int = 0
For Local x:Int = 0 To 2
For Local y:Int = 0 To 1
Drw_Rect(X+dist+x*(imgW+dist) , Y+dist+y*(imgH+dist), imgW,imgH,2)
'Print "i: " + i
If arrImg[i+ScrolledImages] = Null
DrawText "No Image",X+dist+x*(imgW+dist) , Y+dist+y*(imgH+dist)
Else
DrawImage ( arrImg[i+ScrolledImages] , X+dist+x*(imgW+dist) , Y+dist+y*(imgH+dist),0, imgW/arrImg[i+ScrolledImages].Width(), imgH/arrImg[i+ScrolledImages].Height() )
EndIf
i +=1
Next
Next

Case 1
If arrImg[tp] <> Null
SetAlpha 1
DrawImage arrImg[tp], X,Y,0,Width*1/arrImg[tp].Width(),Height*0.87/arrImg[tp].Height()
EndIf
If arrImg[tp+1] <> Null
SetAlpha Alpha
DrawImage arrImg[tp+1], X,Y,0,Width*1/arrImg[tp+1].Width(),Height*0.87/arrImg[tp+1].Height()
EndIf
End Select

BtnLeft.Draw()
BtnRight.Draw()
BtnSwitchViewStyle.Draw()

DrawText("Mode: " + ViewMode+ " | View: " + tp + "/"+loadedImages , X +Width*0.5,Y)
End Method

Method Update:Int()
If BtnLeft.Update() = 101 And gl_mousereleased
If ScrolledImages <= 0

Else
ScrolledImages -= 1
EndIf
EndIf

If BtnRight.Update() = 101 And gl_mousereleased
If (ScrolledImages + 6) >= loadedImages

Else
ScrolledImages += 1
EndIf
EndIf

If BtnSwitchViewStyle.Update() = 101 And gl_mousereleased
If ViewMode = 0
ViewMode = 1
Else
ViewMode = 0
EndIf
EndIf

Select ViewMode
Case 0
Case 1
If MilliSecs() - lastSwitch >= switchIntervall
If (tp + 1) >= loadedImages
tp = 0
Else
tp +=1
EndIf
Alpha = 0
lastSwitch = MilliSecs()
EndIf

Alpha += EqToFPS(1.0/(switchIntervall/1000.0))' 0.02
End Select
End Method

Method OnLoadImageComplete:Void(_image:Image, path:String, source:IAsyncEventSource)
If _image <> Null
arrImg[loadedImages] = _image
loadedImages += 1
Else
Print "no image : "+loadedImages
EndIf

End

End class


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

BeitragDi, Feb 24, 2015 10:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 24, 2015 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Feb 24, 2015 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, sollte so gehen.
Gewinner der 6. und der 68. BlitzCodeCompo

Midimaster

BeitragMi, Feb 25, 2015 10:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group