【问题标题】:WebGL: How to handle context resources after initWebGL:初始化后如何处理上下文资源
【发布时间】:2017-11-14 12:06:40
【问题描述】:

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

【问题讨论】:

    标签: resources webgl


    【解决方案1】:

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

    对于着色器这不一样,在这里,一旦着色器程序链接,您可以分离和删除着色器对象,只要您不需要将另一个程序与相同的着色器对象链接,从而节省内存.这里有一个相对于 OpenGL 的解释,但对于 WebGL 来说同样如此:Proper way to delete GLSL shader?

    【讨论】:

    • 我已经测试过在绑定VAO和调用draw之前删除VBO。目前还没有发生任何不好的事情。然而,我将阅读 VAO 是如何在 WebGL 中实现的。
    • 你可以假设这主要是在 OpenGL 中实现的...... VAO 和 VBO 的用途和用法在 OpenGL 和 WebGL 中是相同的:khronos.org/opengl/wiki/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2023-01-16
    • 2023-03-08
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多