JVM падает, используя JOGL, объекты буфера вершин и пытаясь освободить vbo в методе finalize - PullRequest
1 голос
/ 07 декабря 2011

У меня есть несколько программ CAD, которые я написал.Каждый рисуемый компонент имеет набор объектов буфера вершин.Если компонент удаляется, мне нужно освободить объекты буфера вершин в методе финализации, таком как:

    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);
            }
        }
    }

, однако иногда я получаю сбой SIGSEV и JVM.Файл журнала hs_err указывает на gl.glIsBufferArb (tmp.intValue ()).

Полагаю, это означает, что мой объект gl больше не действителен?

Думаю, он должен был быть действительным.Программа все еще работала вплоть до сбоя.Есть ли способ освободить glbuffer без сохранения ссылки на объект GL?

Спасибо!

1 Ответ

4 голосов
/ 07 декабря 2011

Наиболее очевидная проблема, с которой вы здесь столкнетесь, заключается в том, что на контекст OpenGL можно ссылаться только в том потоке, в котором он активен. Вообще говоря, это будет ваш поток рендеринга, что означает, что контекст OpenGL не будетдоступны в теме финализатора JVM.Это, мне кажется, наиболее вероятная причина ваших ошибок.Я бы порекомендовал вам вести глобальный список недействительных VBO и иметь метод finalize для добавления идентификаторов в этот список.Затем вы можете периодически обрабатывать этот список из потоков рендеринга, делая вызовы OpenGL, необходимые для фактического удаления VBO.

Краткое описание поведения OpenGL в многопоточной среде здесь .

...