【发布时间】:2016-08-26 03:25:04
【问题描述】:
我最近在 JavaScript 中使用 <canvas>,并发现可能会造成非常糟糕的“内存泄漏”(更像是内存爆炸)。使用画布上下文时,您可以使用context.save() 将绘图样式添加到“状态堆栈”,并使用context.restore() 将其删除。 (见the documentation for the rendering context on MDN。)
当您碰巧连续保存到状态堆栈而不恢复时,就会出现问题。在 Chrome v50 和 Firefox v45 中,这似乎只是占用了越来越多的私有内存,最终导致浏览器选项卡崩溃。 (顺便说一下,JavaScript 内存在 Chrome 中不受影响,因此很难使用分析器/时间线工具进行调试。)
我的问题:如何清除或删除画布上下文的状态堆栈? 使用普通数组,您可以检查length,用@987654326 修剪它@ 或简单地重置为空[],但我还没有看到用状态堆栈执行任何此操作的方法。
【问题讨论】:
-
我认为你不能真正拥有堆栈的“长度”。为避免这种情况,只需记住每次您不再需要保存状态时,您必须
restore它。 (还要注意,它会保存你上下文的全部属性,当大多数时候你只需要保存一两个,我个人尽量避免调用这个重方法)。所以你的问题的答案已经在你的问题中了。 -
我正在寻找一个解决方案,如果“简单地记住”失败了,它可能有助于调试。想象一下,您刚刚获得了一个上下文……您将如何清理它或检测是否存在持续存在的问题?
-
如果有人能解释为什么私有内存增加而不是 Chrome 中的 JavaScript 内存增加。这使得诊断变得非常困难。
标签: javascript canvas memory-management memory-leaks html5-canvas