Der Ansatz "Speicher ist reichlich, so dass ich nicht löschen muss" ist schlecht, und der Ansatz "Speicher ist reichlich, so dass ich nie aus dem Speicher Fehler bekomme" ist fehlerhaft.
OpenGL Speicherverwaltung ist obskur, sowohl aus technischen Gründen (siehe t.nieses Kommentar oben) und aus ideologischen Gründen ("du musst es nicht wissen, du willst es nicht wissen"). Es gibt zwar Herstellererweiterungen (z. B. ATI_meminfo), mit denen Sie einige nicht autorisierende-Nummern abfragen können (nicht autorisierend, sofern sie die nächste Millisekunde ändern könnten, und sie berücksichtigen keine Auswirkungen wie Fragmentierung).
Im Allgemeinen ist Ihre Annahme, dass Sie mehr Speicher als GPU-Speicher verwenden können, korrekt.
Sie können jedoch normalerweise nicht den gesamten verfügbaren Speicher verwenden.Wahrscheinlicher ist, dass aufgrund von Beschränkungen, welche Speicherbereiche (und wie große Bereiche) der Treiber zuordnen, sperren und zu welchem DMA gehören kann, ein Grenzwert deutlich unter "allen verfügbaren RAM" liegt. Und obwohl Sie normalerweise mehr Speicher verwenden können, als auf die GPU passt (selbst wenn Sie es ausschließlich verwendet haben), bedeutet dies nicht, dass unvorsichtige Zuordnungen nicht können und nicht schließlich fehlschlagen.
Normalerweise, aber nicht unbedingt, verbrauchen Sie so viel Systemspeicher wie GPU-Speicher (ohne es zu wissen, tut der Treiber das heimlich). Da der Treiber Ressourcen nach Bedarf ein- und austauscht, muss eine Kopie erstellt werden. Manchmal ist es notwendig, 2 oder 3 Kopien zu behalten (z. B. beim Streaming oder für ARB_copy_buffer-Operationen). Manchmal ist das Zuordnen eines Pufferobjekts eine weitere Kopie in einem speziell zugewiesenen Block, und manchmal dürfen Sie direkt in den Speicher des Treibers schreiben. Auf der anderen Seite ist PCIe 2.0 (und PCIe 3.0 noch mehr) schnell genug, um Vertices aus dem Hauptspeicher zu streamen, so dass Sie nicht einmal unbedingt GPU-Speicher benötigen (außer einem kleinen Puffer). Einige Treiber streamen dynamische Geometrie direkt aus dem Systemspeicher.
Einige Grafikprozessoren haben nicht einmal einen separaten System- und GPU-Speicher (Intel Sandy Bridge oder AMD Fusion).
Sie sollten auch beachten, dass das Löschen von Objekten sie nicht unbedingt löscht (zumindest nicht sofort). In der Regel ist das Löschen eines OpenGL-Objekts bis auf wenige Ausnahmen nur ein vorläufiges Löschen, das verhindert, dass das Objekt weiter auf das Objekt verweist (Sie). Der Fahrer behält das Objekt so lange wie es nötig ist.
Auf der anderen Seite, sollten Sie wirklich löschen, was Sie nicht mehr benötigen, und Sie sollten früh löschen. Zum Beispiel sollten Sie einen Shader sofort löschen, nachdem Sie ihn an das Programmobjekt angehängt haben. Dies stellt sicher, dass Sie keine Ressourcen verlieren und es funktioniert garantiert. Löschen und Neuangeben des verwendeten Vertex- oder Pixelpuffers beim Streaming (durch Aufrufen von glBufferData(... NULL);
ist ein bekanntes Idiom. Dies betrifft nur Ihre Ansicht des Objekts und ermöglicht es dem Treiber, das alte Objekt weiterhin parallel für as zu verwenden . solange es ihn braucht
Da die Speicherverwaltung vom System abhängt (kann von System zu System unterschiedlich sein) und mehrere Anwendungen OpenGL gleichzeitig verwenden können, können Sie nicht einmal sicher sein, dass Sie den gesamten Speicher der Grafikkarte nutzen können. Sie würden also nicht um ein eigenes _Ressourcenmanagement_ herumkommen. Dies könnte von Interesse für Sie sein: [Ermitteln des verfügbaren Videospeichers] (http://StackOverflow.com/questions/4552372/Ermitteln-Vorhanden-Video-Memory) –
Ja, der Treiber sollte das tun. Es wird jedoch wahrscheinlich sehr langsam sein, sobald es beginnt Texturen zu tauschen. – jcoder