我目前正在开发一个基于纯JavaScript的游戏。该游戏包含5个大型精灵图(例如2861×768和4096×4864)。游戏启动时,所有5个精灵图都会被预加载到canvas元素中。其中三个精灵表示一起运动,每个精灵包含75帧。当一个精灵结束动画时,我将其隐藏并显示下一个精灵。当第二个精灵完成动画时,我将其隐藏并显示第三/最后一个。
在显示第二或第三个精灵之前,会出现0.5秒至1秒的小延迟。这是因为图片正在解码。
这不仅仅是第一次发生,而是每5分钟重复的动画,小延迟总是发生。
我使用canvas元素进行预加载的原因是,我认为WebKit将删除一段时间未使用的解码图像,而canvas元素将防止WebKit将其从内存中删除。但那行不通。
我已经尝试过几乎我知道的所有优化方法。我甚至通过删除后代选择器等来重构了所有CSS。
我用来绘制这些动画的渲染器是我自己构建的,它在Firefox中运行得非常好,所以那不可能是问题所在。
编辑[2016/03/04]: 我用canvas模式进行了测试,结果更糟糕。它经常卡顿。延迟仍然存在。在NW中,这个问题在Chrome和Firefox中都不存在。
Codepen: 我的渲染器 http://codepen.io/anon/pen/JXPWXX
注意: 如果我使用opacity:0.2
而不是opacity:0
隐藏那些其他元素,则问题不会发生。但是,我不能以这种方式隐藏它们,因为它们仍然可见。它们不应该可见。如果我添加opacity:0.01
,它就不可见,在Chrome中问题就不会发生,但在NW中仍然存在。
在NW中,当我从opacity:0.2
切换到opacity:1
时,会处理图像解码。在Chrome浏览器中不会发生同样的事情。
我使用以下版本:
nw.js v0.12.3
io.js v1.2.0
Chromium 41.0.2272.76
commit hash: 591068b-b48a69e-27b6800-459755a-2bdc251-1764a45
这三个图像精灵的大小分别为14.4MB、14.9MB和15.5MB。每个精灵包含75帧。
为什么会出现这种情况,我该如何防止呢?
image()
方法时存在很重的GC开销。不确定这是由于Processing.js库还是Khan Academy沙盒的影响,但是回归到纯JavaScript可以消除小型100x100像素putImage()
操作上约60MB/s的GC,并提供2-3倍的性能提升。看到处理相关图像的代码部分会有所帮助。 - Nolo