我的代码以某种方式接近GLSL着色器管理,它创建每个着色器和相关程序并删除每个着色器和程序。最近,我读http://www.opengl.org/wiki/GLSL_Object它就在那里说:正确的方法来删除GLSL着色器?
Shader对象,由于被附加到程序对象,将 继续即使你删除Shader对象存在。当系统不再附加到任何程序 对象(当用户要求删除它时),系统只会删除 。
如果我在连接到程序后在着色器对象上调用glDeleteShader()
,我只需要跟踪程序吗?假设这总是正确的,是否安全?
即使已经给出了相同的建议,实际记忆参数和测量结果为+1。 – 2012-02-02 18:14:01
虽然根据[文档](http://www.opengl.org/sdk/docs/man/xhtml/glLinkProgram.xml)所述,您所说的是正确的(“在链接操作之后,应用程序可以自由修改所连接的着色器对象,编译附加着色器对象,分离着色器对象,删除着色器对象以及附加其他着色器对象。“),我遇到了一些不喜欢它的不喜欢它的不喜欢它,尤其是在移动平台上。因为与此有关的问题让我感到沮丧了好几天,所以我建议你不要在之后分离着色器一个链接(删除很好) – 2013-07-28 03:55:13
问题是,只要删除着色器而不分离它,可能不会释放内存 - 它可能只是递减一个引用计数,直到你分离着色器才会变为0。着色器仍然附着,用户可能再次调用链接来重新链接程序,所以驱动程序需要保持足够的信息来做到这一点。所以你需要权衡内存使用与潜在的问题,破坏驱动程序... – 2013-08-28 17:33:32