ActiveObjects() steigen stetig an

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

peter_85

Betreff: ActiveObjects() steigen stetig an

BeitragFr, Jun 07, 2013 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich ändere ständig Bilder um mit dem Befehl loadimage(...). Nun stürzt mein Programm immer nach einer Weile ab und mir ist aufgefallen, dass sich die Anzahl der ActiveObjects stetig erhöht. Shocked

Dies ist so ein Befehl von mir:
baumenue_array(i)\bild = LoadImage ("haus_0"+(i-4)+".bmp")

An anderer Stelle tausche ich dann diese array-Plätze wieder gegen andere Bilder die geladen werden. Eigentlich doch ein und derselbe array-Platz, warum erhöht sich also die Anzahl der Objekte und wie kann ich das verhindern? Bin da grad komplett ratlos...

Xeres

Moderator

BeitragFr, Jun 07, 2013 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du den Speicher nicht mit FreeImage wieder frei gibst, überschreibst du lediglich das Bildhandle und müllst so den Speicher so weit zu, bis er eben platzt.

Generell solltest du nicht LoadImage benutzen, wenn es nicht unabdingbar ist. Es reicht für die meisten Fälle aus, ein Bild einmal zu laden und nur noch zu zu weisen. Wenn du ein Bild mehrmals lädst, belegst du auch mehrfach Speicher.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Eingeproggt

BeitragFr, Jun 07, 2013 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutzt du beim Austauschen der Bilder auch FreeImage? Wink
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

peter_85

BeitragFr, Jun 07, 2013 23:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Wenn du den Speicher nicht mit FreeImage wieder frei gibst, überschreibst du lediglich das Bildhandle und müllst so den Speicher so weit zu, bis er eben platzt.

Generell solltest du nicht LoadImage benutzen, wenn es nicht unabdingbar ist. Es reicht für die meisten Fälle aus, ein Bild einmal zu laden und nur noch zu zu weisen. Wenn du ein Bild mehrmals lädst, belegst du auch mehrfach Speicher.


Hi Xeres,

wie genau verweise ich denn auf mein geladenes Bild? Habe noch keinen Befehl in der Art gesehen.

Xeres

Moderator

BeitragFr, Jun 07, 2013 23:43
Antworten mit Zitat
Benutzer-Profile anzeigen
So Simpel, wie BB nun mal ist, einfach zuweisen:
BlitzBasic: [AUSKLAPPEN]
Local img1 = LoadImage(...)
Local img2 = img1
DrawImage(img2, x, y)

Und genauso kann man bestimmen, ob zwei Variablen auf das selbe Bild verweisen:
BlitzBasic: [AUSKLAPPEN]
If img1 = img2 Then ...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

BladeRunner

Moderator

BeitragSa, Jun 08, 2013 9:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Prinzipiellerweise ist es allerdings ungünstig ständig zur Laufzeit Bilder neu zu laden. Da scheint an deinem Grundkonzept was nicht zu stimmen. Warum werden die Bilder denn immer wieder nachgeladen?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

MCocktail

BeitragSa, Jun 08, 2013 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:
Warum werden die Bilder denn immer wieder nachgeladen?


Vielleicht, weil das Bild verändert wird. Wenn das der Fall ist kannst du ein einziges "Original"-Bild laden und es mit CopyImage in ein anderes kopieren(z.B. ins Array), die Kopie irgendwie verändern und wenn es nötig ist, das Bild freimachen(FreeImage) und dann neu vom Original hineinkopieren.
Gruß von: MCocktail

BladeRunner

Moderator

BeitragSa, Jun 08, 2013 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sind aber nur Mutmaßungen, meinst du nicht auch?
peter_85 kann sagen was er vor hat - er alleine. Und anhand dessen kann man sein Vorgehen analysieren. alles andere ist blind in den Schnee gepinkelt und damit nur sehr begrenzt sinnvoll.

Zudem erwähnt er copyimage nicht, er spricht explizit von loadimage.
Am sinnvollsten aber wäre es wenn peter uns aufklärt und wir alles raten sein lassen ...
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

peter_85

BeitragSo, Jun 09, 2013 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie immer muss ich mich für die schnellen und hilfreichen Antworten bedanken! Very Happy

Xeres hat Folgendes geschrieben:
So Simpel, wie BB nun mal ist, einfach zuweisen:
BlitzBasic: [AUSKLAPPEN]
Local img1 = LoadImage(...)
Local img2 = img1
DrawImage(img2, x, y)

Und genauso kann man bestimmen, ob zwei Variablen auf das selbe Bild verweisen:
BlitzBasic: [AUSKLAPPEN]
If img1 = img2 Then ...


Da hatte ich wirklich etwas grundlegendes noch nicht verstanden, genau das war mein Problem. Klingt überaus logisch, aber ich bin wohl u.a. deswegen nicht drauf gekommen, weil die fps-Rate vollkommen unberührt blieb. Embarassed


Edit: Mit welcher Taste(nkombination) kann ich in BB meine Suche fortsetzen, ohne ständig wieder in das Suchfeld klicken zu müssen?

Holzchopf

Meisterpacker

BeitragSo, Jun 09, 2013 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Standardmässig geht das mit F3, aber ich weiss nicht, ob die normale BB-IDE dieses Feature auch unterstützt. Es gibt übrigens auch alternative IDEs für BB, ganz stark empfehlen kann man dir IDEal Wink

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

Xeres

Moderator

BeitragSo, Jun 09, 2013 12:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Um meinen Hinweis zu vervollständigen: Ein Bild/Sound/Mesh Handle ist immer einfach eine Zahl ungleich 0.
BlitzBasic: [AUSKLAPPEN]
Local img ;* Die Variable wird mit "0" initialisiert
img = LoadImage(...) ;* Es wird versucht(!) ein Bild zu laden
If img Then ...
;* Die Variable enthält einen Wert ungleich 0, also war das Laden Erfolgreich!
Else
;* Die Variable enhält immer noch 0 -> der Pfad in LoadImage ist falsch, oder die datei existiert gar nicht
EndIf

Diese Zahl wird durch Freeimage nicht zurückgesetzt! Wenn du prüfen willst, ob eine Variable noch/schon wieder ein Bild enthält, solltest du das also selbst machen:
BlitzBasic: [AUSKLAPPEN]
FreeImage(img) ;* Bild aus dem Speicher werfen
img = 0 ;* Jetzt ungültiges Handle wegwerfen


Zur Tastenkombination:
Du benutzt doch hoffentlich nicht die Standard IDE? Üblicherweise benutzt man IDEal.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

peter_85

BeitragSo, Jun 09, 2013 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähm doch, hatte die Standard IDE benutzt.
Sieht deutlich übersichtlicher mit IDEal aus, muss ich schon sagen... Rolling Eyes

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group