sup*_*rqd 5 javascript memory-leaks webgl
我有一个管理大量数据的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);
Run Code Online (Sandbox Code Playgroud)
对于我创建的每个缓冲区,我也会进行相应的调用以将其删除(必要时删除):
gl.deleteBuffer(buffer);
Run Code Online (Sandbox Code Playgroud)
但是,正如在jsfiddle测试代码中可以看到的,删除缓冲区似乎不会释放浏览器使用的内存.即使缓冲区被删除,它也会很快耗尽内存.
这显然是一个人为的例子,但它确实反映了我正在做的事情(即创建缓冲区并稍后删除它们),但随着时间的推移,它似乎会导致内存不被释放.
我应该如何释放这些记忆以避免泄漏?有任何想法吗?
小智 0
在动画循环中重复创建和删除缓冲区绝不是一个好主意,因为它会导致视频内存碎片。视频内存不像 Java 或 .NET 那样由强大的垃圾收集器管理,因为它与性能形成鲜明对比。在删除完整的 GL 上下文之前,通过“deleteBuffer”释放的内容实际上可能不会被释放以供新用途。
如果您需要使用大量动态变化的缓冲区,请使用 gl.DYNAMIC_DRAW 提示,这将导致驱动程序将缓冲区存储在 CPU 内存中并将其流式传输到 GPU 以进行每个单独的渲染(当然会造成性能损失)或继续重复使用缓冲区(过度配置其尺寸可能是明智的)。
许多专业 3D 引擎只对所有网格使用一个大型顶点缓冲区对象,使用 bufferSubData 和带有偏移的绘图命令。
| 归档时间: |
|
| 查看次数: |
4093 次 |
| 最近记录: |