我正在编写一个小型WebGL引擎,我想知道是否有任何理由保留创建然后缓冲或编译并保存在另一个对象中的gl上下文资源?例如:我为position,normals,uv和indices创建缓冲区,然后将其缓冲到VAO中。在保存在VAO中之后(即初始化之后)删除缓冲区(即除VAO之外的所有缓冲区)是好的做法,还是可以在其他某个点使用缓冲区(并在明确销毁相应对象时删除资源)? createShader和deleteShader调用也是如此:在编译并保存到程序对象后,我可以安全地删除vsh,创建的着色器还是可以在其他点重用它们?
答案 0 :(得分:1)
VAO不包含顶点数据,它只存储绑定缓冲区上指针配置的状态。然而,资源删除有些模糊,因为资源需要被解除才能被释放。无论如何,只要您需要绘制顶点数据,这些数据就需要在内存中,并且这些数据不是(概念上)由VAO引用,而是由VBO引用。在最糟糕的" case(我从未测试过),如果你在VAO仍在使用时请求删除VBO,也许你只是失去了对VBO的访问权限,但数据仍在内存中。逻辑方法是在您使用这些数据绘制内容时保留VBO引用。这样您就可以访问和控制数据。一旦要删除所有内容,首先删除VAO,然后删除相关的VBO。
对于着色器,这是不一样的,在这里,您可以在着色器程序链接后分离和删除着色器对象,只要您不需要将另一个程序与相同的着色器对象链接,允许您节省内存。这里是一个相对于OpenGL的解释,但对于WebGL也是如此:Proper way to delete GLSL shader?