【发布时间】:2015-10-05 19:34:45
【问题描述】:
我有 2 个canvas 元素,我以 125 毫秒的间隔绘制它们。
由于它们的工作性质,它们都必须完全重新绘制,因此不可能只重新绘制它们的某些部分来提高性能。
问题
当我在任务管理器中看到时,工作集(内存)会根据我重新绘制画布的速度不断增加。
到目前为止我已经尝试过什么
使用 clearRect 进行清理(而不是再次设置它的宽度)
尝试删除画布的父 div 并重新创建 div 并在其中再次加载画布:这有助于减缓内存增加,但并不能完全阻止它。
将不同的 context.fills 减少到尽可能少,但同样由于画布的性质,它仍然有很多这样的内容。
即使我做了所有这些事情,Working Set 也可能很高,但不应不断增加。
对如何控制内存泄漏有什么建议吗?
更新: 泄漏不在画布图纸中。我正在使用网络工作者将数据传递到画布,该画布在某处泄漏。很抱歉造成混乱!
【问题讨论】:
-
不看代码就很难知道,尽管 js 内存泄漏经常围绕未删除的事件侦听器展开。就您的过度绘制问题而言,您可以将多个画布叠加在一起,并且只重绘需要它的画布(尽管用户只能与顶层交互)。我猜您可能正在重绘 fn 中创建一个闭包,并将您的图像数据重新分配给重复数量的封闭本地变量。
-
“由于他们的工作性质,他们都必须完全重绘”你确定你不能解析更多不需要每帧更新的画布上的绘图吗?这样你就可以使用
drawImage(),这是画布上最快的方法之一 -
@JaredSmith 的观点值得挖掘。我也想知道您是否考虑使用 beginPath :您知道如果不这样做,路径会长大吗?显示一些代码,否则很难分辨。
-
另一个建议:尽量减少你的应用程序,让它什么都不做。你不应该有任何泄漏。现在一一重新启用您的功能,直到它泄漏。
-
@GameAlchemist 有一个很好的观点 - 这将允许您确定实际消耗的来源并允许您进行重构以使事情更加优化。
标签: html canvas memory-leaks html5-canvas web-worker