在调试我正在开发的画布库时,我遇到了一个问题,Chrome 开发者工具会在每个 animationframe 中报告“合成层”和“更新层树”,但没有重新绘制或移动任何对象。
例如:
var x = 0;
( function tick( ) {
window.requestAnimationFrame(tick);
x++;
}( ) )
这些操作不耗时(每帧 0.005-0.05 毫秒),但我想知道为什么会发生这种情况。
我能想到的唯一想法是,Chrome 使用类似于:
console.time( "composite layers" );
// do compositing
for( var i = 0; i < compositedLayers.length; ++i ) {
// not triggered since compositedLayers.length = 0
// but takes some time to be checked
compositedLayers[i].composite();
}
console.timeEnd( "composite layers" );
如果是这样的话,为什么“Paint”、“Recalculate Style”、“Layout”等操作不会以同样的方式触发?
更新:
- 此问题发生在Chrome 36/37(Windows)中
- 在Chromium 34(Linux)中,它只显示复合图层
- 其他系统未经测试
Edit1:只有使用requestAnimationFrame
时才会出现这种情况。与预期相同,setInterval
只显示计时器已启动。
Edit2:示例的完整源代码:pastebin
setInterval
一样工作吗? - bbuecherl