Общие ресурсы OpenGL: удалить с помощью finalize() или реализовать подсчет ссылок?
Я пишу 3d модель библиотеки.
Многие разные модели могут использовать одни и те же ресурсы OpenGL, такие как текстуры, буферы, программы, объекты-атрибуты вершин и т. Д.
Когда модель больше не нужна, я ее удаляю. Таким образом, если ресурсы OpenGL остаются без ссылок, их тоже необходимо удалить с помощью команд API OpenGL.
Итак, что из следующего лучше реализовать?
- Установить команду OpenGL API для удаления ресурсов OpenGL внутри
finalize()
объекта. Я прочитал во многих статьях, которыеfinalize()
это дьявол Я верю в это, потому что GC может быть вызван в любое время (после уничтожения контекста OpenGL) или нет вообще. - Реализовать систему подсчета ссылок для классов Java, которые обрабатывают ресурсы OpenGL. Это требует много кода, и это все равно что заново изобретать колесо, потому что GC уже работает с подсчетом ссылок.
Итак, каков наилучший подход в подобных случаях?
1 ответ
Похоже, finalize
всегда неправильно. GC не будет вызываться, когда у вас достаточно кучи памяти... а тем временем у вас могут закончиться ресурсы OpenGL. Это просто не может работать.
GC может быть вызван в любое время (после уничтожения контекста OpenGL)
Это не проблема (при условии, что ресурс, на который нет ссылок, может быть освобожден в любое время; могут быть проблемы с потоками и порядком), проблема в том, что он может быть вызван слишком поздно для вас.
потому что GC уже работает с подсчетом ссылок.
Это не. Он использует гораздо более эффективный подход, который (в отличие от подсчета ссылок) может обрабатывать циклы. Стоимость - это недетерминизм, который кусает вас, когда вы имеете дело с другими ресурсами.