Umfrage zur maximalen Imagegröße

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

3170, 32 MB

Hab ich was verpasst? :shock:
(System im Profil)
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

Hi,
also das is ja mal nen Phänomen: 4160
Und wenn ich direkt mit size=32000 öffne funzts aber auch 32000....

Is PB Buggy? :shock:

mfg
125
Bild
BildDas ist Tux. Kopiere Tux in deine Signatur und hilf ihm so auf seinem Weg zur Weltherrschaft.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Laurin hat geschrieben:3170, 32 MB

Hab ich was verpasst? :shock:
(System im Profil)
Du solltest mal im Taskmanager nachsehen, was da alles noch läuft. Oder PCI-Express ist doch nicht so gut /:->
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Ist wohl mehr ein Problem der Video-Speicherverwaltung des Betriebssystems. Windows XP32 mit 32-Bit Videoauflösung ergibt bei mir 5.220/88MB, bei 16-Bit Videoauflösung sind es 7.390/177MB. Lege ich fest, PB soll nur mit 256 Farben ausgeführt werden, gibt es folgende Werte: 10.440/353MB.
Die Begrenzung auf 8.192 scheint nicht mehr gültig zu sein.
XP64 regelt das Ganze offensichtlich besser.

Gruss
Helle
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

Beitrag von computerkranker »

Image haben nichts mit der Grafikkarte und deren Speicher zutun, außer man bildet das Image auf dem Bildschirm ab. Im Speicher sind sie nur eine Datenmenge, die halt als Type Image verwaltet wird. Das sieht man am besten daran, dass man Image’s erzeugen kann die größer sind als der Grafikkartenspeicher, z.B. bei Laptops mit Shared-Grafikkartenspeicher der ist meistens 16 oder 32 MB. Trotzdem kann man dort mit PB ein 60 MB großes Image erzeugen.

Ich lasse mich natürlich gern eines besseren belehren.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

ts-soft hat geschrieben:
Laurin hat geschrieben:3170, 32 MB

Hab ich was verpasst? :shock:
(System im Profil)
Du solltest mal im Taskmanager nachsehen, was da alles noch läuft. Oder PCI-Express ist doch nicht so gut /:->
29 Prozesse, 313 MB RAM verbraucht (aber nur weil Firefox gerade 85 MB verbraucht :wink: ). Es ist also noch ein 2/3 GB frei.

125-Methode funktioniert auch bei mir.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Jason
Beiträge: 123
Registriert: 06.01.2005 17:47

Re: Umfrage zur maximalen Imagegröße

Beitrag von Jason »

computerkranker hat geschrieben:Ich bekomme es einfach nicht hin, die in der Hilfe angegebene Größe von 8192x8192 mit dem Befehl CreateImage() zu erreichen. Bei mir ist bei 4630x4630 Schluss.
Ab Seite 2 lesen...
http://forums.purebasic.com/german/view ... c&start=10

Und...
http://forums.purebasic.com/german/view ... =loadimage

3000, 29MB

Win98se, Matrox G450 steht auf 24Bit Farbtiefe, 512MB RAM
Der Rest ist Schweigen!
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

Beitrag von computerkranker »

In VMWare Win98SE habe ich jetzt auch mal getestet.

Das Ergenis ist schon ein wenig komisch.

512MB Frei 465MB |2050 13MB
256MB Frei 180MB |2050 13MB
128MB Frei 74MB |2050 13MB
64MB Frei 26MB | 2050 13MB
32MB Frei 16MB | 2050 13MB
16MB Frei 0MB beim Start und nach dem Test 8MB es dauerte auch sehr lange :-)|2050 13MB


Das es nicht an einer Begrenzung des Rechners(RAM oder GK) liegt kann man mit folgenden Bespiel gut testen.
Da das Programm endlos läuft und am Ende den Speicher für das Image nicht frei gibt, sollte beim Starten einer weiteren Instanz kein Image mehr erzeugt werden. Bei mir kann ich aber mit jeder Instanz immer wieder die gleiche Imagegröße erzeugen.

Code: Alles auswählen

Exit=0 
Size=1000 
Repeat 
  If CreateImage(1,Size,Size) 
    FreeImage(1) 
    Size+10 
    Debug Size 
  Else 
    Exit=#True 
  EndIf 
Until Exit 
Debug "Erstellt bis: "+Str(Size) 
Debug Str(Size*Size*4/1024/1204)+"MB" ;bezogen auf 32Bit 
CreateImage(1,size,size)
Repeat
ForEver
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Nun, ein Image, unkomprimiert, befindet sich doch in der Form Header + BGR in der BMP-Datei und wird im Speicher einfach zu RGB gedreht, soweit ich weiß. Manche Programme können on-the-fly umrechnen und benötigen kein Umdrehen des 1ten und 3ten byte. Der Speicherverbrauch eines Bitmaps mit 24 bit ist also höhe * breite * 3. Um ein Image zu erstellen benötigt es also nichts weiter als den Speicher zu reservieren und Bytedaten des Images einzuladen oder anzugeben. Was dann noch Fehlt wäre ein Header, der macht aber nur noch 54 Byte aus.

Wie genau das PB intern macht, weiß ich natürlich nicht, aber irgendwas läuft da gewaltig schief, wenn gerade mal ca. 50 MB Speicher bereitgestellt werden können, wo mehr drinne wär. Mittels AllocateMemory komme ich hingegen zu 23.000 x 23.000 * 3 = 1,587 GB Speicher. Das bedeutet, der Speicher wäre da, nur PB macht das mit Images irgendwie anders.

Ich hab parallel dazu ein C/C++ -Programm geschrieben welches die gleiche Funktion hat und Speicher bereitstellt:

Code: Alles auswählen

#include <iostream>

using namespace std;

int main()
{
    int size = 3000;
    bool repeat = false;
    char* buffer = NULL;

    while(repeat == false)
    {
        buffer = (char*) malloc(size*size*3);
        if (buffer != NULL)
        {
            size+=100;
            cout<<size<<endl;
        }
        else
        {
            repeat = true;
        }
        free(buffer);
        buffer = NULL;
    }
    cout<<"Maximale Groesse: "<<size<<" Byte. Das sind "<<size*size*3/1000/1000<<" MB im Speicher.";
    cin.get();
}
Hier können sogar 25900 *25900 * 3 Byte = ca. 2012 MB Speicher reserviert werden. Und dieser Speicher könnte zur Bildung eines Images genutzt werden, denn letztendlich ist ein Image im Speicher ja nichts weiter als ein Byte-Array von breite x höhe x (bitProPixel/8).
Mittels der WinAPI kann man auch Images aus solchen Speicherbereichen erstellen. Ich habe es nicht getestet aber theoretisch müsste es klappen, aus diesem Byte-Array ein Image zu erstellen welches dann eventuell auch in PB nutzbar wäre. Oder zumindest mit den WinAPI-Funktionen könnte man mit dem Image handlen.

EDIT: Schon klar, ich müsste durch 1024 teilen, war mir zu dumm. Näherungswerte reichen mir hier auch aus, ob das nun 2000 MB oder 2048 MB sind, macht hier wenig Unterschied. ;)
Benutzeravatar
computerkranker
Beiträge: 66
Registriert: 12.10.2004 21:21

Beitrag von computerkranker »

Als ich das ganze schon mal im Bug Forum angesprochen habe schrieb Fred:
Just checked the code and couldn't detect any problem. I could see difference on my system when switching the desktop depth from 32 bits to 16 bits (more images can be created). That's because the images matches the display format.
http://forums.purebasic.com/english/vie ... terkranker

Mit 13MB unter Win98 für Bilder, kann ich persönlich nicht leben >_<
Antworten