在调试我正在研究的画布库时,我遇到了chrome-devtools在每个动画帧中不断报告“复合图层”和“更新图层树”,而不重新绘制或移动任何对象。
一个例子:
var x = 0;
( function tick( ) {
window.requestAnimationFrame(tick);
x++;
}( ) )
这些操作不是耗时的(每帧0.005 - 0.05 ms),但我想知道为什么会这样。
我想到的唯一想法是,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" );
因此,如果是这种情况,为什么“画笔”,“重新计算风格”,“布局”......不会以同样的方式触发?
更新
EDIT1:
仅在使用requestAnimationFrame
时才会出现这种情况。 setInterval
仅按预期显示计时器已触发。
EDIT2: 示例的完整源代码:pastebin
答案 0 :(得分:5)
来自https://code.google.com/p/chromium/issues/detail?id=325419:
...即使像素输出中没有任何变化也是如此 屏幕,页面可以使整个渲染状态无效 通过例如污染文件的风格。 Blink别无选择 recalc风格,重新布局,油漆和复合材料。有时这些 当没有任何有效改变的时候,步骤可以提早 - 但是那样 很难确定。
另见Compositor Thread Architecture - 似乎rAF触发了两个合成器线程之间的层树同步。