Seite 1 von 2
ImageSpeicher begrenzt?
Verfasst: 07.02.2005 12:15
von computerkranker
Vielleicht gibt es ja schon einen Thread hier drüber dann habe ich ihn nicht gefunden.
Habe das Probem das bei grossen Images diese nicht mehr erzeugt werden.
Bei diesem Beispiel endet das erstellen bei einer Grösse von 5365x5365.
Code: Alles auswählen
c=5350
While a=b
c+1
MImage1=CreateImage(#PB_Any,c,c)
Debug Str(c)+" - "+Str(MImage1)
If IsImage(MImage1)
FreeImage(MImage1)
Else
Debug "kein image erzeugt!"
a=1
b=2
Debug c
EndIf
Wend
Kein Problem, muss man sich halt an die grösse halten, dachte ich.
Das zweite Beispiel zeigt aber das es anscheinend eine Gesamtbegrenzung für den Imagespeicher gibt.
Code: Alles auswählen
c=3250
While a=b
c+1
MImage1=CreateImage(#PB_Any,c,c)
MImage2=CreateImage(#PB_Any,5000,5000)
Debug Str(c)+" -1 - "+Str(MImage1)
Debug Str(c)+" -2 - "+Str(MImage2)
If IsImage(MImage1)
FreeImage(MImage1)
EndIf
If IsImage(MImage2)
FreeImage(MImage2)
Else
Debug "kein image erzeugt!"
a=1
b=2
Debug c
EndIf
Wend
Ich lasse mich natürlich gerne eines besseren belehren.
Mein Programm sollte aber mehr Bilder verarbeiten können. Zumindest soviele wie RAM vorhanden ist. Will mir ja jetzt nicht unbedingt eine Speicherverwaltung für Bilder schreiben müssen.

Verfasst: 07.02.2005 12:18
von DarkDragon
Ja der ImageSpeicher ist begrenzt, von Computer zu Computer(CPU Abhängig).
Verfasst: 07.02.2005 12:47
von Zaphod
so ein großes bild macht für fast keine anwendung sinn, aber, ja klar ist speicher begrenzt. warum sollte sich jemand 512mb ram kaufen wenn 4mb schon ungbegrenzt währen?
ein bild der größe 5365x5365 pixel braucht mindestens 109,8mb speicher auf der grafikkarte. zusätzlich braucht die grafikkarte noch speicher für die framebuffer. ich nehme mal an deine grafikkarte hat nur 128mb speicher?
eventuell kannst du stattdessen mit PB_Sprite_Memory die sprites in den ramspeicher laden und von da aus mit ihnen arbeiten, was aber wahrscheinlich ziemlich langsam sein wird.
wofür willst du solche großen bilder haben? ausser vieleicht für die druckvorstufe von postern macht das keinen sinn.
Verfasst: 07.02.2005 12:52
von DarkDragon
Zaphod hat geschrieben:so ein großes bild macht für fast keine anwendung sinn, aber, ja klar ist speicher begrenzt. warum sollte sich jemand 512mb ram kaufen wenn 4mb schon ungbegrenzt währen?
ein bild der größe 5365x5365 pixel braucht mindestens 109,8mb speicher auf der grafikkarte. zusätzlich braucht die grafikkarte noch speicher für die framebuffer. ich nehme mal an deine grafikkarte hat nur 128mb speicher?
eventuell kannst du stattdessen mit PB_Sprite_Memory die sprites in den ramspeicher laden und von da aus mit ihnen arbeiten, was aber wahrscheinlich ziemlich langsam sein wird.
wofür willst du solche großen bilder haben? ausser vieleicht für die druckvorstufe von postern macht das keinen sinn.
Nur bei Sprites oder Texturen bzw. 3D Sachen ist der GPU am werk soviel ich weiß. Der CPU schaltet bei GDI/GTK ein.
Verfasst: 07.02.2005 13:02
von Zaphod
hm? hab ich was anderes gesagt? loadsprite lädt grafiken aber standardmäßig in den grafikkarten speicher.
der 4mb<>512mb vergleich sollte nur die endlichkeit des speichers (wie philosophisch) verdeutlichen. ich hätte natürlich auch sagen können, warum sollte sich jemand ein grafikkarte mit 512mb speicher kaufen, wenn eine grafikkarte mit 4mb unbegrenzt großen speicher zur verfügung stellen kann.
Verfasst: 07.02.2005 14:20
von computerkranker
Ich rede hier aber nicht von Sprite und auch nicht vom GK-RAM(256MB bei mir), sondern vom Arbeitspeicher und der ist bei mir 2GB. LoadImage läd das Bild auch in den Arbeitspeicher. Wenn ich 4 Bilder(90% vom Imagespeicher oder so) in einer Anwendung geladen habe und eine anderer Teil der Anwendung läd ein Bild für eine Umwandlung, dann würde ein grosses Bild, was sonst geht, hier nicht mehr umgewandelt werden. Ausser ich gebe alle anderen Image frei.
Verfasst: 07.02.2005 14:23
von DarkDragon
Zaphod hat geschrieben:hm? hab ich was anderes gesagt? loadsprite lädt grafiken aber standardmäßig in den grafikkarten speicher.
LoadImage aber nicht(Darüber reden wir).
so ein großes bild macht für fast keine anwendung sinn, aber, ja klar ist speicher begrenzt. warum sollte sich jemand 512mb ram kaufen wenn 4mb schon ungbegrenzt währen?
ein bild der größe 5365x5365 pixel braucht mindestens 109,8mb speicher auf der grafikkarte.
Wo ist da ein LoadSprite in diesem Text zu sehen? 109,8mb sind dann im cpu, nicht im gpu.
Verfasst: 07.02.2005 16:27
von Zaphod
oh stimmt, dachte ich hätte ein loadsprite gesehen.
wie groß sind denn die anderen 4 bilder?
was du bedenken mußt, zum laden wird mehr speicher gebraucht, als das bild eigentlich einnehmen würde, da es je nach format mehr oder weinger aufwendig interpretiert werden muß. bei 2gigs ram wird das aber wahrscheinlich nicht der grund sein. kann schon sein das es eine festkodierte größenbeschränkung gibt.
aber wozu brauchst du so große images?
Verfasst: 07.02.2005 18:16
von computerkranker
Nehmen wir an, ein Programm hat eine Import-Funktion für Bilder. Diese sollte dann möglichst die grösst mögliche Bildgrösse importieren können. Nennen wir das ganze mal 100%(des möglichen). Das Programm stellt weiterhin die Funktion zur Verfügung, das man in einer MDI Oberfläche, einige dieser Bilder betrachten kann. Diese Bilder brauchen ja jetzt auch Speicher, also wäre jetzt die Import-Funktion's Bildgrösse=100%-Bilderspeicher. Das würde ja bedeuten, das um so mehr Bilder geöffnet sind um so kleiner ist die Importgrösse. In diesen Fall frage ich mich dann warum es virtuellen Speicher gibt und das aufrüssten von RAM wäre ja auch nicht mehr notwendig

Oder anderst gesagt: eine prof. Anwendung schreiben mit PureBasic die solche Funktionen hat geht nur über die API...

...lasse mich natürlich wie immer eines besseren belehren...

Verfasst: 07.02.2005 19:48
von Zaphod
wenn ich so ein programm schreiben würde, würde ich mir zuerst überlegen, ob ich die bilder denn wirklich in voller größe anzeigen muß. da ich bisher kein display gesehen habe, dass 4 bilder von 5000*5000 pixel bilder größe darstellen könnte (also eine auflösung von mindestens 10000*10000 pixel hätte), brauche ich diese wohl nicht in voller größe im speicher zu haben. in einem mdi fenster wird entweder nur ein auschnitt des bildes zu sehen sein oder ein stark verkleinertes bild. also brauch man die bilder nur kurz in voller größe zu laden und kopiere mir den bereich den ich haben will, bzw skaliere ihn und benutze das kleinere bild.
die api hat auch einschränkungen. eine anwendung in purebasic zu schreiben, die solche funktionen hat erfordert nachdenken... wie in jeder anderen programmiersprache auch.