Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript WebGL删除缓冲区内存泄漏?_Javascript_Memory Leaks_Webgl - Fatal编程技术网

Javascript WebGL删除缓冲区内存泄漏?

Javascript WebGL删除缓冲区内存泄漏?,javascript,memory-leaks,webgl,Javascript,Memory Leaks,Webgl,我有一个管理大量数据的WebGL应用程序。我在IE11上遇到过一些问题,它很快就会耗尽内存(Chrome和FF没有出现这个问题)。然而,当我创建一些测试代码来隔离泄漏的原因时,测试代码也在Chrome上泄漏。进一步的测试表明,即使是Chrome在实际应用中也存在泄漏,或者看起来存在泄漏,但似乎不像IE11那样崩溃 下面是显示问题的测试代码: 基本上,我使用以下方法创建缓冲区: var buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFE

我有一个管理大量数据的WebGL应用程序。我在IE11上遇到过一些问题,它很快就会耗尽内存(Chrome和FF没有出现这个问题)。然而,当我创建一些测试代码来隔离泄漏的原因时,测试代码也在Chrome上泄漏。进一步的测试表明,即使是Chrome在实际应用中也存在泄漏,或者看起来存在泄漏,但似乎不像IE11那样崩溃

下面是显示问题的测试代码:

基本上,我使用以下方法创建缓冲区:

var buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, bufferData, gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, null);
对于我创建的每个缓冲区,我还进行了相应的调用,以如下方式删除它(必要时删除):

但是,从JSFIDLE测试代码中可以看出,删除缓冲区似乎并不能释放浏览器使用的内存。即使缓冲区被删除,它也会很快耗尽内存

显然,这是一个人为的例子,但它确实反映了我正在做的事情(即创建缓冲区,然后删除它们),但随着时间的推移,这似乎会导致内存无法释放


我应该如何释放此内存以避免泄漏?有什么想法吗?

在动画循环中重复创建和删除缓冲区从来都不是一个好主意,因为它会导致视频内存碎片。视频内存不是像Java或.NET那样由功能强大的垃圾收集器管理的,因为它与性能形成强烈对比。在删除完整的GL上下文之前,使用“deleteBuffer”释放的内容实际上可能不会释放以供新用途

如果您需要使用大量动态变化的缓冲区,可以使用gl.DYNAMIC_DRAW提示,这将导致驱动程序将缓冲区存储在CPU内存中,并将其流式传输到GPU以进行每次渲染(当然会导致性能损失),也可以继续重复使用缓冲区(过度设置其维度可能是可取的)


许多专业3D引擎对所有网格只使用一个大型顶点缓冲区对象,使用bufferSubData和带偏移量的绘图命令。

根据您对@mpfeffrie的评论,您的最佳选择似乎是找到一个随时可用的对象池(满足您的需要)
或制作一个自己的对象池

这一概念,如果不知道的话,将以一种非常清晰的方式进行解释

如果可能的话,我会为缓冲区数组分配内存。这种保存“大”数据块的数组非常可怕。你永远无法确定他们到底为自己保留了多少空间

此外,您可以重新检查是否没有留下任何对变量的遗忘引用


如果您在预加载时有一些“空闲”时间,您可以尝试每隔一段时间暂停渲染几分钟,这可能有助于可怜的
GC
完成其工作

我根本不在动画循环中创建和删除缓冲区(缓冲区在下载数据时创建,在离开应用程序主页时删除,以及其他条件等)。我举的这个例子是为了演示delete缓冲区似乎无法释放内存,这正是我想弄明白的。我也有同样的问题。这听起来像是Chrome的一个bug,因为IE和Firefox在这个主题上运行得很好。这似乎是Chrome的一个bug。这是Chrome中的一个bug,似乎在不久前就解决了。@Mac上的superqd Chrome 49.0.2623.112仍然存在这个问题,看起来也是如此。
gl.deleteBuffer(buffer);