JVM аварийно завершает работу с использованием JOGL, объектов буфера вершин и пытается освободить vbo в методе финализации
-
29-10-2019 - |
Вопрос
У меня есть написанное мной программное обеспечение САПР.Каждый рисуемый компонент имеет набор объектов буфера вершин.Если компонент удаляется, я должен освободить объекты буфера вершин в методе finalize, например:
родовое словооднако я иногда получаю сбой SIGSEV и JVM.Файл журнала hs_err указывает на gl.glIsBufferArb (tmp.intValue ()).
Я считаю, что это означает, что мой объект gl больше не действителен?
Думаю, он должен был оставаться в силе.Программа работала до сбоя.Есть ли способ освободить glbuffer без сохранения ссылки на объект GL?
Спасибо!
Решение
Самая очевидная проблема, с которой вы здесь столкнетесь, заключается в том, что на контекст OpenGL можно ссылаться только в потоке, в котором он активен. Вообще говоря, это будет ваш поток рендеринга, что означает, что контекст OpenGL не будетдоступный в потоке финализатора JVM.Мне кажется, что это наиболее вероятная причина ваших ошибок.Я бы порекомендовал вам вести глобальный список недействительных VBO, а метод finalize добавлять в этот список идентификаторы.Затем вы можете периодически обрабатывать этот список из потоков рендеринга, делая вызовы OpenGL необходимыми для фактического удаления VBO.
Вы можете найти краткое изложение поведения OpenGL в многопоточной среде здесь .