Frage zu den Image ID's

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Frage zu den Image ID's

Beitrag von DarkSoul »

Hallo,

ich habe mal eine Frage zu LoadImage():

Doumentation sagt zum Rückgabewert:
Returns nonzero if the image was loaded successfully and zero if the image could not be loaded. If #PB_Any was specified as the #Image parameter then the auto-generated number is returned on success.
Es gibt ja diese zwei Möglichkeiten, ein Bild zu laden:

Code: Alles auswählen

;manuelle Vergabe
bla = 0;
If LoadImage(bla, "xyz.png") = 0 : error....

;automatische Vergabe
bla = LoadImage(#PB_Any, "xyz.png");
If bla = 0 : error....
Wird im zweiten Fall auch die ID 0 vergeben? Wenn ja, wie unterscheide ich den Fall vom Fehlerfall?

Und irgendwann habe ich hier mal als Antwort bekommen, dass folgendes zu Speicherverschwendung führt:

Code: Alles auswählen

LoadImage(0, "xyz.png")
LoadImage(10000, "xyz2.png")
;Jetzt hat das PB-interne ID-Array 10000 Einträge, wovon nur 2 sinnvoll verwendet werden. 1-9999 sind leer.
Jedoch vergibt die #PB_Any-Variante noch viel größere ID's ohne für mich erkennbares System. Ist das dann nicht Speicherverschwendung hoch 3, wenn zigtausende leere Arrayelemente erzeugt werden?
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Frage zu den Image ID's

Beitrag von NicTheQuick »

Ganz einfach:
Mit #PB_Any bekommst du eigentlich ein PB-internes Handle zurück, also eine Speicheradresse. Die kann niemals 0 sein, aber ist meistens auch sehr hoch. Vergleichbar mit den Rückgabewerten von 'AllocateMemory()'.
Bei der Verwendung von festen IDs erstellt Purebasic intern ein Array und nutzt die übergebene ID als Index in diesem Array. Lädst du also ein Image mit der ID 10000, wird ein Array erstellt, das mindestens 10001 Einträge (inklusive Index 0) hat. Und am Index 10000 wird dann der Pointer zur PB-internen Image-Struktur abgelegt. Deswegen kommt auch eine Compilerwarnung, wenn die übergebene Image-ID zu hoch ist. Dann könnte sie sich irgendwann mit den Pointerwerten beißen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage zu den Image ID's

Beitrag von RSBasic »

DarkSoul hat geschrieben:Wenn ja, wie unterscheide ich den Fall vom Fehlerfall?
Du kannst sowohl den Rückgabewert als auch mit IsImage prüfen, ob das Bild erfolgreich geladen wurde.
Beispiel 1:

Code: Alles auswählen

EnableExplicit

Define Image
Define Result

UsePNGImageDecoder()

DisableDebugger;Nur um Compiler-Warnungen zu ignorieren
Result = LoadImage(1, "D:\Grafiken\Beispielbilder\Beispielbild1.png")
EnableDebugger
If Result
  Debug "Erfolgreich"
Else
  Debug "Fehler"
EndIf

DisableDebugger;Nur um Compiler-Warnungen zu ignorieren
Image = LoadImage(#PB_Any, "D:\Grafiken\Beispielbilder\Beispielbild1.png")
EnableDebugger
If Image
  Debug "Erfolgreich"
Else
  Debug "Fehler"
EndIf
Beispiel 2:

Code: Alles auswählen

EnableExplicit

Define Image

UsePNGImageDecoder()

DisableDebugger;Nur um Compiler-Warnungen zu ignorieren
LoadImage(1, "D:\Grafiken\Beispielbilder\Beispielbild1.png")
EnableDebugger
If IsImage(1)
  Debug "Erfolgreich"
Else
  Debug "Fehler"
EndIf

DisableDebugger;Nur um Compiler-Warnungen zu ignorieren
Image = LoadImage(#PB_Any, "D:\Grafiken\Beispielbilder\Beispielbild1.png")
EnableDebugger
If IsImage(Image)
  Debug "Erfolgreich"
Else
  Debug "Fehler"
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Frage zu den Image ID's

Beitrag von DarkSoul »

Achso :shock:

Dann ist alles klar.

Also kann man beide Varianten gleichzeitig nutzen? Ich habe immer nur eine Varante verwendet, um Kollisionen zu vermeiden :mrgreen:
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Frage zu den Image ID's

Beitrag von NicTheQuick »

Ja, gleichzeitiges Nutzen ist kein Problem. :allright:
Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Frage zu den Image ID's

Beitrag von DarkSoul »

Danke!
Bild
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Frage zu den Image ID's

Beitrag von #NULL »

Variante 4 würde ich vermeiden:
RSBasic hat geschrieben:...Beispiel 2:

Code: Alles auswählen

...
Image = LoadImage(#PB_Any, "D:\Grafiken\Beispielbilder\Beispielbild1.png")
EnableDebugger
If IsImage(Image)
  Debug "Erfolgreich"
...
Wenn man Bibliotheken verwendet oder sonst irgendwie static und dynamic IDs gleichzeitig verwendet werden könnten, dann könnte es ein Image 0 durchaus geben und ein fehlschlagendes LoadImage() wird nicht richtig erkannt, bzw sogar das Image 0 aus einem ganz anderen Kontext gekidnappt und verwendet. Also besser nur den Rückgabewert an sich überprüfen, oder für dynamic IDs IsImage() immer mit <>0 checken.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Frage zu den Image ID's

Beitrag von Bisonte »

Ich persöhnlich nutze (wenn es statisch sein soll) immer Werte erst ab 1...

So kann man einfach gegen Null testen, ohne das man IsGadget oder IsImage usw nutzen muss,
da diese doch langsamer werden können, je mehr Gadgets usw in Benutzung sind.

(Es wird intern ja die komplette Liste durchgeackert bei den IsIrgendwas() Funktionen)
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Frage zu den Image ID's

Beitrag von NicTheQuick »

Bisonte hat geschrieben:(Es wird intern ja die komplette Liste durchgeackert bei den IsIrgendwas() Funktionen)
Weißt du das sicher oder wie kommst du drauf? Warum sollte da eine Liste durchgearbeitet werden?
Ich weiß zwar auch nicht wie sie es machen, wenn man ein dynamisch (#PB_Any) angelegtes Objekt hat, es löscht, und dann IsObject() darauf anwendet, aber Listen durcharbeiten kommt mir komisch vor.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage zu den Image ID's

Beitrag von RSBasic »

Mir ist nur bekannt, dass mehr Speicher verbraucht wird, wenn man höhere statische IDs verwendet, da alle freien IDs vorher definiert werden. So war es jedenfalls damals so. Es kann aber auch sein, dass dieses Problem nicht mehr existiert.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten