为什么chromecast在动画帧之间需要这么长时间
Why does chromecast take so long between animation frames
我正在开发一款游戏,它在Mac上的chrome上运行得很顺利,但在chromecast上运行得非常缓慢。我已经对JS进行了相当多的优化。
我以为这只是chromecast中的低功耗硬件,再加上缓慢的JS。
但调查一下,使用JS中的性能对象,似乎调用的动画帧之间的延迟比我的代码要长得多。
Court.prototype.update = function () {
if (!window.court.paused) {
if (window.debug) {
console.log('time since last update ' + (performance.now() - window.start) + ' ms');
}
window.start = performance.now();
window.court.draw(); // my drawing routing
var end = performance.now();
if (window.debug) {
console.log('to exit court.draw() took ' + (end - window.start) + ' ms');
}
// reschedule next animation update
window.requestAnimationFrame(window.court.update);
}
};
当我运行该代码并遵循chromecast的控制台输出时,我得到的是:
自上次更新以来的时间89.75099999998201 ms
court.draw()花费0.984999999665888毫秒
自上次更新以来的时间89.35899999960384 ms
court.draw()花费29.77499999997235毫秒
自上次更新以来的时间106.3719999973382 ms
court.draw()花费1.5410000000920263毫秒
自上次更新以来的时间93.464999992375 ms
court.draw()花费0.3149999997767736毫秒
自上次更新以来的时间91.99499999977706 ms
court.draw()花费0.31399999988934724毫秒
自上次更新以来的时间126.3730000000578 ms
court.draw()花费9.191000000100757毫秒
自上次更新以来的时间104.5799999999726 ms
court.draw()花费了0.316000001080334毫秒
自上次更新以来的时间99.06599999976606 ms
court.draw()花费了0.313000000091968 ms
自上次更新以来的时间94.06499999977677 ms
court.draw()花费了0.314000003404566毫秒
自上次更新以来的时间88.65700000023935 ms
因此,我的绘图程序需要1到30ms,但动画帧大约每100ms调用一次,以提供10fps的最大刷新率。
有没有办法让chromecast降低刷新率?
我们已经能够使用requestAnimationFrame在Chromecast上获得30FPS。为设备优化代码是非常重要的。积极地重复使用对象,不要在游戏循环中分配对象或添加新属性。
我建议只从一个基本的requestAnimationFrame处理程序开始,而不需要任何代码来获得基线性能。然后开始添加动画逻辑,并使用Chrome开发工具来测量和查找瓶颈。
我现在几乎要放弃了,得出的结论是Chromecast速度慢,完全停止。
我已经删除了所有的绘图代码,并有一个只计算几件事的例程,以及对JS类上的方法的几次调用,这些调用几乎没有什么作用。
计时和帧间时间我得到三帧的重复周期,帧间时间为10ms、10ms和30ms,平均50ms,或约60fps,这是可以的
court.draw()耗时5.6939999999485735毫秒自上一帧以来的时间10.18 ms
court.draw()耗时5.745999999817286毫秒自上一帧以来的时间10.55 ms
court.draw()耗时5.7399999999605061毫秒自上一帧以来的时间29.22毫秒
在我的代码中,每帧只需清除并绘制一个代表一个球的非常小的矩形,时间就会缩短到25ms,帧与帧之间的时间会缩短到70ms。。。。让它慢得令人难以忍受。。。
由于没有任何工具来进一步了解为什么它如此缓慢,我觉得我现在只是在浪费时间。。
我已插入代码以测量主调用,并启用/禁用绘图调用(对context.ClearRect()和context的调用)。FillRect(用于画布)
结论:
不绘制时:
我的代码大约需要15-16ms(需要改进一下!)帧之间的刷新周期约为20ms因此即使不绘制,每帧也有4-5ms的开销。。。
绘制时:
我的代码调用绘图方法需要大约28毫秒-->12毫秒的额外时间帧之间的刷新周期约为65ms因此绘制时每帧有37ms的开销-->在我自己的代码中,它在"前景"中的12毫秒--->在调用requestAnimationFrame()之间的"后台"中有25毫秒
因此,即使我把自己的代码降到10ms(比如说),我也怀疑它会把60fps所需的时间减少到16ms,因为(大概)背景工作是填充显示器上的像素,我无法再减少更多。。。。我只是在绝对必要的时候才移除/绘制东西。
我在画布上画1、2或3个小盒子,用单色。。。。不确定是否还有一些额外的画布绘制技巧我可以尝试?
- 为什么我的上下文选择器和.buttonset()在ie中花费了这么长时间
- 谷歌地图需要很长时间才能在ie11中渲染
- Mongoose查询在两个日期时间之间提取数据
- 有没有一种方法可以检查javascript以毫秒为单位执行一个函数需要多长时间
- 我一直收到的控制台警告是什么?推迟长时间运行的计时器任务以提高滚动的流畅性
- 为什么这个代码不起作用?我花了很长时间试图弄清楚这一点
- 如何在长时间执行JavaScript期间显示微调器
- 长时间轮询:每个浏览器中的通知
- angularjs计算开始时间和当前时间之间的时间差
- 完整日历:如何支持一次点击和不长时间点击
- 获取用户和服务器时间之间的时间差
- 如何使用 javascript 停止对 asp.net 进行正在进行的回发(长时间运行的执行)
- 为什么这个 AJAX 调用需要这么长时间
- 为什么这个正则表达式需要这么长时间才能执行
- 如何在javascript中计算两个日期时间之间的差异
- 如何修复长时间运行的脚本
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- javascript秒表限制最长时间
- 为什么chromecast在动画帧之间需要这么长时间
- 为什么Express在AngularJS $http.get的控制台日志之间花费这么长时间?