Общие ресурсы OpenGL: удалить с помощью finalize() или реализовать подсчет ссылок?

Я пишу 3d модель библиотеки.

Многие разные модели могут использовать одни и те же ресурсы OpenGL, такие как текстуры, буферы, программы, объекты-атрибуты вершин и т. Д.

Когда модель больше не нужна, я ее удаляю. Таким образом, если ресурсы OpenGL остаются без ссылок, их тоже необходимо удалить с помощью команд API OpenGL.

Итак, что из следующего лучше реализовать?

  • Установить команду OpenGL API для удаления ресурсов OpenGL внутри finalize() объекта. Я прочитал во многих статьях, которые finalize() это дьявол Я верю в это, потому что GC может быть вызван в любое время (после уничтожения контекста OpenGL) или нет вообще.
  • Реализовать систему подсчета ссылок для классов Java, которые обрабатывают ресурсы OpenGL. Это требует много кода, и это все равно что заново изобретать колесо, потому что GC уже работает с подсчетом ссылок.

Итак, каков наилучший подход в подобных случаях?

1 ответ

Похоже, finalize всегда неправильно. GC не будет вызываться, когда у вас достаточно кучи памяти... а тем временем у вас могут закончиться ресурсы OpenGL. Это просто не может работать.

GC может быть вызван в любое время (после уничтожения контекста OpenGL)

Это не проблема (при условии, что ресурс, на который нет ссылок, может быть освобожден в любое время; могут быть проблемы с потоками и порядком), проблема в том, что он может быть вызван слишком поздно для вас.

потому что GC уже работает с подсчетом ссылок.

Это не. Он использует гораздо более эффективный подход, который (в отличие от подсчета ссылок) может обрабатывать циклы. Стоимость - это недетерминизм, который кусает вас, когда вы имеете дело с другими ресурсами.

Другие вопросы по тегам