为了进行一个反应时间研究(如果您感兴趣,请参阅此问题),我们想要控制和测量图像的显示时间。我们希望考虑到在不同用户的机器上重新绘制所需的时间。
编辑:最初,我只使用内联执行来计时,并认为我不能相信它可以准确地测量图片在用户屏幕上可见的时间,因为绘制需要一些时间。
后来,我发现了事件 "MozAfterPaint"。它需要对用户计算机进行配置更改,而相应的 WebkitAfterPaint 没有成功。这意味着我无法在用户计算机上使用它,但我用它进行了自己的测试。我贴出了相关的代码片段和我的测试结果。
我还在 Chrome 中使用 SpeedTracer 手动检查了结果。
后来,我发现了事件 "MozAfterPaint"。它需要对用户计算机进行配置更改,而相应的 WebkitAfterPaint 没有成功。这意味着我无法在用户计算机上使用它,但我用它进行了自己的测试。我贴出了相关的代码片段和我的测试结果。
我还在 Chrome 中使用 SpeedTracer 手动检查了结果。
// from the loop pre-rendering images for faster display
var imgdiv = $('<div class="trial_images" id="trial_images_'+i+'" style="display:none"><img class="top" src="' + toppath + '"><br><img class="bottom" src="'+ botpath + '"></div>');
Session.imgs[i] = imgdiv.append(botimg);
$('#trial').append(Session.imgs);
// in Trial.showImages
$(window).one('MozAfterPaint', function () {
Trial.FixationHidden = performance.now();
});
$('#trial_images_'+Trial.current).show(); // this would cause reflows, but I've since changed it to use the visibility property and absolutely positioned images, to minimise reflows
Trial.ImagesShown = performance.now();
Session.waitForNextStep = setTimeout(Trial.showProbe, 500); // 500ms
// in Trial.showProbe
$(window).one('MozAfterPaint', function () {
Trial.ImagesHidden = performance.now();
});
$('#trial_images_'+Trial.current).hide();
Trial.ProbeShown = performance.now();
// show Probe etc...
MozAfterPaint和内联执行测量时间的比较结果。
这让我感到有些不满意。首先,中位数显示时间比我想要的短约30ms。其次,使用MozAfterPaint的方差相当大(比内联执行更大),因此我不能仅通过增加setTimeout 30ms来调整它。第三,这是在我的相对快速的计算机上得出的结果,其他计算机的结果可能更差。
SpeedTracer的结果
这些结果比较好。图像可见时间通常在预期持续时间内,最多有4毫秒或10毫秒的偏差。此外,Chrome在setTimeout
调用时考虑了重新绘制所需的时间(如果需要重新绘制图像,则调用时间会相差504毫秒)。
不幸的是,我无法分析和绘制SpeedTracer中许多试验的结果,因为它只记录在控制台中。我不确定SpeedTracer和MozAfterPaint之间的差异是反映了两个浏览器的差异还是我的MozAfterPaint使用中的缺陷(我相当确定我正确解释了SpeedTracer输出)。
问题
我想知道:
- 我该如何测量它在用户机器上实际可见的时间,或者至少获取一组不同浏览器在不同测试计算机上的可比较数字(Chrome,Firefox,Safari)?
- 我能否抵消渲染和绘制时间,以达到500毫秒的实际可见性?如果我必须依赖于通用偏移量,那将更糟,但仍然比在相对较慢的计算机上以如此短的时间显示图像好。
- 我们使用setTimeout。 我知道
requestAnimationFrame
,但似乎我们无法从中获得任何好处:
该研究应在整个研究期间关注,重要的是我们获得+/- 500ms的显示时间,而不是确定数量的fps。 我的理解正确吗?
performance.now
中的不同问题(非单调时间,系统时钟轮询问题)。我的容差级别大约是绘制是否太长。但是我如何找出我的容差级别是否被违反?这归结为1,对吧? - Ruben