【问题标题】:Shared OpenGL resources: delete with finalize() or implement reference counting?共享 OpenGL 资源:使用 finalize() 删除还是实现引用计数?
【发布时间】:2017-10-28 10:51:47
【问题描述】:

我写了一个 3d 模型库。

许多不同的模型,可以共享相同的 OpenGL 资源,如纹理、缓冲区、程序、顶点属性对象等。

当不再需要模型时,我将其删除。因此,如果 OpenGL 资源未被引用,也必须使用 OpenGL API 命令删除。

那么,以下哪个更好实施?

  • 设置 OpenGL API 命令以删除对象 finalize() 内的 OpenGL 资源。我在很多文章中读到finalize() 是魔鬼。我相信它,因为 GC 可以随时调用(在 OpenGL 上下文销毁之后),或者根本不调用。
  • 为处理 OpenGL 资源的 java 类实现引用计数系统。这需要大量代码,而且就像重新发明轮子一样,因为 GC 已经使用引用计数。

那么,在这种情况下,最好的方法是什么?

【问题讨论】:

    标签: java garbage-collection reference-counting finalize


    【解决方案1】:

    我猜,finalize 总是错的。当您有足够的堆内存时不会调用 GC...同时您可能会用完 OpenGL 资源。这是行不通的。

    GC可以随时调用(在OpenGL上下文销毁之后)

    这不是问题(假设可以随时释放未引用的资源;可能存在线程和顺序相关的问题),问题是调用它可能为时已晚。

    因为 GC 已经使用引用计数。

    它没有。它使用更有效的方法(与引用计数不同)可以处理周期。当您处理其他资源时,成本是非确定性对您的影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 2023-02-07
      • 2016-03-03
      • 2010-12-02
      • 1970-01-01
      • 2013-05-27
      相关资源
      最近更新 更多