SFML (OpenGL) - warum kann ich so viele Texturen laden?
-
Hi,
ich habe gerade mal auf einem alten Windows 7 PC mit einer Onboard-Grafikkarte ein paar Tests mit SFML (welches ja auf OpenGL basiert) gemacht. Die Onboard-Karte nutzt max. 128 MB vom Hauptspeicher und die Maximum Texture Size ist 2048x2048.
Ausgehend davon, dass eine Textur in der Größe 2048x2048x4BPP pro Textur ja 16 MB Speicher auf der GraKa belegt sollten sich also maximal 8 Texturen in dieser Größe laden lassen.
Dem ist aber offenbar nicht so, denn ich kann ~160 Texturen laden (~2,5 GB).
Somit vermute ich, dass OpenGL sich die Texturen die nicht auf der GraKa liegen bei Bedarf aus dem Hauptspeicher holt? Ist das wirklich so? Wie Performant ist das und funktioniert das auch wenn eine externe Grafikkarte verwendet wird, die sich ja nicht am Hauptspeicher bedient?
Hintergrund meines Tests ist das ich gerne meine Spritesheets in doppelter Auflösung rendern möchte, bislang benötige ich für alles 4 Texturen à 2048x2048. Darum wollte ich auf dieser alten Möhre mal testen ob das alles noch funktionieren würde wenn ich alles größer rendere.
Danke für alle Antworten im voraus.
-
GoaZwerg schrieb:
Die Onboard-Karte nutzt max. 128 MB vom Hauptspeicher und die Maximum Texture Size ist 2048x2048.
ich glaube es ist "min. 128MB", die 128MB sind quasi fest reserviert, diese kann die graka dann garantieren was z.b. fuers OS wichtig ist. sonst koennte es passieren, dass beim booten irgendwas out of memory laeuft und dann der gpu driver eine fehlermeldung anzeigen soll und selbst natuerlich nichts allokieren kann.
du solltest entsprechend in dem taskmanager immer die 128MB weniger als verfuegbarer speicher sehen.
Somit vermute ich, dass OpenGL sich die Texturen die nicht auf der GraKa liegen bei Bedarf aus dem Hauptspeicher holt? Ist das wirklich so?
indirekt ist das so, der driver fragt beim OS an dass ihm memory pages zur verfuegung gestellt werden, diese mapt der driver dann in der GPU. und nutzt diese dann wie die 128MB auch.
Wie Performant ist das
ist immer derselbe speicher, immer auf die gleiche weise verwendet, sollte also die gleiche performance sein.
funktioniert das auch wenn eine externe Grafikkarte verwendet wird, die sich ja nicht am Hauptspeicher bedient?
das ist individuel. treiber koennen immer pages fuer sich allokieren wenn das OS welche frei hat. sogar wenn garkeine hardware zur verfuegung steht (z.b. ramdisk).
mit PCI(e) ist es moeglich addressen zu mappen, also dass z.b. ein teil der soundkarte, festplatte etc. einen addressbereich bekommen und alle die damit kommunizieren dann einfach mit pointern drauf schreiben koennen. die uebersetzung davon welcher addressbereich auf welche realen speicher gemappt wird macht der memory controller.
entsprechend kann auch die GPU daten aus dem system ueber PCIe->memorycontroller lesen/schreiben. wie das genau synchronisiert wird ist dann sache des herstellers, es kann sein dass es cache coherent ist, es kann sein dass die GPU nur cache coherent beim lesen/schreiben von sich selbst ist und der treiber das synchronisieren muss (z.b. mit flushes). davon haengt dann auch ab wie schnell/langsam die sache ist.
bei NVidias OpenGL driver gibt es extensions wie "persistant memory" bei dem speicher einmal allokiert und gemappt wird und von da an sowohl cpu als auch gpu drauf arbeiten, die sind dann voll synchronisiert und das funktioniert mit externen GPUs/grakas. fuer viele dinge ist das sogar der empfohlene/schnellste weg.
-
Vielen Dank für Deine ausführliche Erklärung