JVM crasht met JOGL, vertex-bufferobjecten en probeert de vbo te bevrijden in een definitieve methode

Ik heb wat CAD-software die ik heb geschreven. Elke component die wordt getekend, heeft een set vertex-bufferobjecten. Als de component wordt verwijderd, moet ik de vertex-bufferobjecten vrijmaken in de definitieve methode, zoals:

    if (gl != null) {
        Integer[] keys = vbos.keySet().toArray(new Integer[0]);
        for (int i = 0; i < keys.length; i++) {
            Integer tmp = keys[i];
            if (tmp != null) {
                if (gl.glIsBufferARB(tmp.intValue()));
                gl.glDeleteBuffersARB(1, new int[]{tmp.intValue()}, 0);
            }
        }
    }

ik krijg echter soms een SIGSEV- en JVM-crash. Het logbestand hs_err verwijst naar gl.glIsBufferArb (tmp.intValue ()).

Ik geloof dat dit betekent dat mijn gl-object niet langer geldig is?

Het had volgens mij nog steeds geldig moeten zijn. Het programma werkte nog tot de crash. Is er een manier om een ​​glbuffer te bevrijden zonder een verwijzing naar het GL-object te hebben opgeslagen?

Dank je!

1

1 antwoord

Het meest voor de hand liggende probleem dat u hier tegen zult komen, is dat er alleen naar een OpenGL-context kan worden verwezen in de thread waarin deze actief is. Dit is doorgaans uw renderingthread, wat betekent dat de OpenGL-context niet beschikbaar is in de De laatste draad van JVM. Dat lijkt mij de meest waarschijnlijke oorzaak van je fouten. Ik zou aanraden dat u een algemene lijst van ongeldige VBO's bijhoudt, en dat de laatste methode iden aan die lijst toevoegt. U kunt die lijst vervolgens periodiek van uw renderingthreads verwerken, waardoor de OpenGL-oproepen nodig zijn om de VBO's daadwerkelijk te verwijderen.

U kunt snel een overzicht vinden van het gedrag van OpenGL in een omgeving met meerdere threads hier .

4
toegevoegd
Dit is een goede suggestie, bedankt!
toegevoegd de auteur vextorspace, de bron