ImageSpeicher begrenzt?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

ImageSpeicher begrenzt?

Beitrag 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.:mrgreen:
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Ja der ImageSpeicher ist begrenzt, von Computer zu Computer(CPU Abhängig).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

Beitrag 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.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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?
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

Beitrag 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 :lol:
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... :mrgreen:
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Antworten