WebGL:初始化后如何处理上下文资源

WebGL: How to handle context resources after init

我正在编写一个小型 WebGL 引擎,我想知道是否有任何充分的理由将创建后缓冲或编译并保存在另一个对象中的 gl 上下文资源保留下来?例如:我为位置、法线、uv 和索引创建缓冲区,然后将其缓冲到 VAO 中。在 VAO 中保存后(即初始化后)删除缓冲区(即除 VAO 之外的所有缓冲区)是一种好习惯,还是我可以在其他时间使用缓冲区(并在显式销毁相应对象时删除资源)? createShader 和 deleteShader 调用也是如此:编译并保存到程序对象后,我可以安全地删除创建的 vsh、fsh 着色器,还是可以在其他时候重用它们?

VAO 不包含顶点数据,它只存储,也就是说,绑定缓冲区上的指针配置状态。然而,资源删除有点模糊,因为资源需要解除绑定才能释放。无论如何,只要您需要绘制顶点数据,这些数据就需要在内存中,并且这些数据不是(概念上)由 VAO 引用,而是由 VBO 引用。在 "worst" 情况下(我从未测试过),如果您在 VAO 仍在使用时请求删除 VBO,也许您只是失去了对 VBO 的访问权限,但数据仍在内存中。只要您使用这些数据绘制某些东西,合乎逻辑的方法就是保留您的 VBO 引用。这样您就可以保持对数据的访问和控制。一旦你想删除所有东西,你首先要删除 VAO,然后是相关的 VBO。

对于着色器,这是不一样的,在这里,一旦着色器程序被 linked,您就可以分离和删除着色器对象,只要您不需要 link 另一个程序使用相同的着色器对象,让您节省内存。这里有一个解释,相对于 OpenGL,但对于 WebGL 同样适用:Proper way to delete GLSL shader?