对于反应时间研究(如果您有兴趣,请参阅此问题),我们想要控制和测量图像的显示时间。我们想考虑在不同用户的机器上重新绘制所需的时间。
编辑:最初,我只使用内联执行来计时,并且认为我不能相信它能够准确地测量图片在用户屏幕上可见的时间,因为绘画需要一些时间。
后来,我找到了事件“ 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 和内联执行测量的持续时间的结果。
这不会让我太高兴。首先,中值显示持续时间比我想要的短约 30 毫秒。其次,使用 MozAfterPaint 的方差非常大(并且比内联执行更大),所以我不能简单地通过将 setTimeout 增加 30 毫秒来调整它。第三,这是在我相当快的计算机上,其他计算机的结果可能会更糟。
SpeedTracer 的结果
这些更好。图像可见的时间通常在预期持续时间的 4(有时)10 毫秒内。看起来 Chrome 也考虑了在调用中重新绘制所需的时间setTimeout
(因此,如果图像需要重新绘制,则调用之间存在 504 毫秒的差异)。不幸的是,我无法在 SpeedTracer 中分析和绘制许多试验的结果,因为它只记录到控制台。我不确定 SpeedTracer 和 MozAfterPaint 之间的差异是否反映了两个浏览器的差异,或者是我在使用 MozAfterPaint 时缺少的东西(我很确定我正确地解释了 SpeedTracer 输出)。
问题
我想知道
- 如何测量它在用户机器上实际可见的时间,或者至少获得不同测试计算机(Chrome、Firefox、Safari)上一组不同浏览器的可比数字?
- 我可以抵消渲染和绘画时间以达到 500 毫秒的实际可见性吗?如果我必须依赖通用偏移,那会更糟,但仍然比在如此短的时间内显示图像要好,以至于用户在速度较慢的计算机上不会有意识地看到它们。
- 我们使用
setTimeout
. 我知道,requestAnimationFrame
但似乎我们无法从使用它中获得任何好处:
该研究应该是整个研究期间的焦点,更重要的是我们获得 +/-500 毫秒的显示而不是某个特定的帧数。我的理解正确吗?
显然,Javascript 对此并不理想,但它对我们的目的来说是最不坏的(该研究必须在用户自己的计算机上在线运行,要求他们安装一些东西会吓跑一些人,Java 没有捆绑在 Mac OS X 浏览器中不再)。
目前我们只允许当前版本的 Safari、Chrome、Firefox 和 MSIE(性能检测功能。现在和全屏 API,我还没有检查 MSIE 是如何做的)。