6

这样做的正确方法是什么?

我正在执行以下步骤:

  1. 创建着色器
  2. 编译着色器
  3. 创建程序
  4. 将着色器附加到程序
  5. 链接程序
  6. 删除着色器

http://www.opengl.org/wiki/GLSL_Object它说:即使在链接程序之后,您也不必显式分离着色器对象。但是,最好在链接完成后执行此操作,否则当您尝试删除程序对象时,程序对象将使其附加的着色器对象保持活动状态。

还有从正确的方式删除 GLSL 着色器?说如果我不删除着色器会增加内存。

所以检查http://www.opengl.org/sdk/docs/man/xhtml/glDetachShader.xml,它说如果着色器已经通过调用 glDeleteShader 被标记为删除并且它没有附加到任何其他程序对象, 分离后将被删除。

所以我的#6 是没用的,除非我把它拆下来,对吧?

我应该在正确编译程序后分离和删除(以节省内存)还是应该仅在我的应用程序关闭时分离/删除?

4

1 回答 1

5

所以我的#6 是没用的,除非我把它拆下来,对吧?

是的。GL 所做的基本上是引用计数。只要其他对象引用着色器对象,它就会保持活动状态。如果删除对象,实际删除将推迟到最后一个引用被删除。

我应该在正确编译程序后分离和删除(以节省内存)还是应该仅在我的应用程序关闭时分离/删除?

那取决于你。当您不再需要它时,您可以立即将其删除。如果您不打算重新链接该着色器,您可以在初始链接操作后立即销毁所有附加的着色器对象。但是,着色器对象毕竟不会消耗太多内存(并且不会进入 GPU 内存,只有最终程序会),如果您稍后删除它们通常没什么大不了的,甚至不删除它们all,因为当 GL 上下文被销毁时(包括应用程序退出的情况),所有的 GL 资源都会被销毁。当然,如果您在运行时动态创建着色器,您还应该动态删除旧的和未使用的对象,以避免积累大量未使用的对象并有效地泄漏内存/对象名称等。

于 2013-08-29T19:11:06.190 回答