LockImage() verursacht Memory-Leaks?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: LockImage() verursacht Memory-Leaks?

BeitragDi, Jul 26, 2016 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich bin auf ein Problem gestoßen: Ich möchte in einer Schleife ein Bild locken, sodass ich es verändern kann. Am Ende der Schleife unlocke ich es wieder. Folgender Simpler Test-Code BlitzMax: [AUSKLAPPEN]
Graphics(800, 600)

SetMaskColor(255, 0, 255)

Local Image:TImage = LoadImage("image.bmp", MASKEDIMAGE)

Local lastpos:Int = 0

Local timer:TTimer = CreateTimer(60)

Local pixmap:TPixmap = Null

Repeat
WaitTimer(timer)
Cls()

pixmap = LockImage(Image)

DrawImage(Image, 0, 0)

If (KeyHit(KEY_LEFT))
DebugLog("tesdt")
ClearPixels(pixmap, $FF000000)
EndIf

UnlockImage(Image)

Flip(0)
Until KeyHit(KEY_ESCAPE)

End


führt zu einem starken Anstieg des Wertes "Arbeitsspeicher (privater Arbeitssatz)", welcher im Taskmanager unter "Prozesse" zu finden ist. schon nach kurzer Zeit überschreitet der Wert bei mir die 200.000 K (wofür auch immer das steht, schätzungweise Kilobyte (nicht Kelvin Rolling Eyes ))

Ist das bei euch auch so? Wenn ja, kann man dagegen was tun?
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Holzchopf

Meisterpacker

BeitragDi, Jul 26, 2016 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo CO2

Bei mir steigt der Wert auch kontinuierlich bis über 200'000 K an, springt aber jeweils kurz danach wieder runter auf ~15 K. Das wiederholt sich ständig. Wird vermutlich einfach damit zu tun haben, dass der Garbage Collector bei 60 FPS nicht ganz mitmacht und aus Perfomance-Gründen nur arbeitet, wenn es sich auch wirklich lohnt Wink

Du kannst ihn übrigens mit GCCollect() manuell aufrufen. Mit einem GCCollect() in der Schleife bleibt bei mir der Arbeitsspeicher konstant um die 15 K.

MfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

CO2

ehemals "SirMO"

BeitragDi, Jul 26, 2016 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhm, habe das ausprobiert (auch mit pixmap = Null), hatte jedoch keine Auswirkungen. Was etwas gebracht hat, war die Nutzung von Framework. Folgender Code erzeugt keine Memory-Leaks BlitzMax: [AUSKLAPPEN]
Framework BRL.GLMax2D
Import BRL.PolledInput
Import BRL.Pixmap
Import BRL.Timer

Import BRL.BMPLoader

SetGraphicsDriver GLMax2DDriver()

Graphics(800, 600)

SetMaskColor(255, 0, 255)

Local Image:TImage = LoadImage("image.bmp", MASKEDIMAGE)

Local lastpos:Int = 0

Local timer:TTimer = CreateTimer(60)

Repeat
WaitTimer(timer)
Cls()

DrawImage(Image, 0, 0)

Local pixmap:TPixmap = LockImage(Image)

If (KeyHit(KEY_LEFT))
ClearPixels(pixmap, $FF000000)
EndIf

UnlockImage(Image)

Flip(0)
Until KeyHit(KEY_ESCAPE)

End


Übrigens: Wenn ich DrawImage rausnehme, wird gar kein Speicher mehr allokiert (außer dem, der für das Bild selbst gebraucht wird).

EDIT: Übrigens, wenn man den Direct3D-Treiber nimmt, wird weniger Speicher benötigt, als wenn man den Glut-Treiber nimmt BlitzMax: [AUSKLAPPEN]
Framework BRL.D3D7Max2D
Import BRL.Timer
Import BRL.PolledInput
Import BRL.Pixmap

Import BRL.BMPLoader

SetGraphicsDriver D3D7Max2DDriver()

Graphics(800, 600)

SetMaskColor(255, 0, 255)

Local Image:TImage = LoadImage("image.bmp", MASKEDIMAGE)

Local lastpos:Int = 0

Local timer:TTimer = CreateTimer(60)

Repeat
WaitTimer(timer)
Cls()

DrawImage(Image, 0, 0)

Local pixmap:TPixmap = LockImage(Image)

If (KeyHit(KEY_LEFT))
ClearPixels(pixmap, $FF000000)
EndIf

UnlockImage(Image)

Flip(0)
Until KeyHit(KEY_ESCAPE)

End
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Holzchopf

Meisterpacker

BeitragDi, Jul 26, 2016 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Kommt es bei dir wirklich zum Memory-Leak oder beobachtest du ein Verhalten ähnlich zu dem, was ich oben beschrieb?

Beide Codes von dir bewirken bei mir wieder mehr oder weniger das gleiche. Also die GL-Variante genau das gleiche, mit D3D geht's einiges langsamer und es springt auch schneller wieder auf einen tiefen Wert.

Ich glaube mal irgendwo aufgefasst zu haben, dass OpenGL dynamische Bilder aus irgend einem Grund doppelt im Speicher hält. Das würde den Unterschied wohl schon erklären.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

CO2

ehemals "SirMO"

BeitragDi, Jul 26, 2016 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich habe es mal getestet und es ist tatsächlich so, dass ohne die Einschränkung auf ein Framework der Wert im Task-Manager auf über 1.000.000 K ansteigt. Viel weiter habe ich es noch nicht laufen lassen... Mit Angabe des Frameworks sind die Piks bei GL bei ~65.000 K, bei D3D bei ~25.000 K - Es kommt zu der bekannten Sägezahnkurve. Scheint also etwas anderes zu sein.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group