【发布时间】:2013-09-14 11:52:37
【问题描述】:
我正在开发一个动画库,并且每隔一段时间我都会运行一次基准测试,看看我在使用某些功能时获得了多少收益或损失。最近遇到一件让我很困惑的事情,也许有更多知识的人可以为我解释一下。
之前的表现:
- Chrome:~4460 个精灵 @ 30fps
- Safari:~2817 个精灵 @ 30fps
- FireFox:~1273 个精灵 @ 30fps
- iPhone 4S:~450 @ 30fps
现在的表现:
- Chrome:~3000 个精灵 @ 30fps
- Safari:~2950 个精灵 @ 30fps
- FireFox:约 1900 个精灵 @ 30fps(在垃圾收集变得过于分散注意力之前)
- iPhone 4S:~635 @ 30fps
因此,您可以看到,Chrome 的性能受到了相当大的打击,而其他所有浏览器似乎在这段时间内都变得更好了。我注意到的最重要的事情,我想的是答案,是 Chrome 中的 CPU 使用率似乎已经被限制了(我发誓在我能接近 90% 之前,现在它的最大值约为 60%)。大部分 CPU 都用于drawImage() 调用,我不确定我能做些什么来优化它。
如果这只是 Chrome 现在限制我的 CPU 使用率的问题,我可以接受。
任何见解将不胜感激......
_s.Sprite.prototype.drawBasic = function() {
var s = this.ctx;
if(s.globalAlpha!=this._alpha) s.globalAlpha = this._alpha;
var width = this.width;
var height = this.height;
var x = this._x;
var y = this._y;
if (_s.snapToPixel) {
x = this._x + (this._x < 0 ? -1 : 0) | 0;
y = this._y + (this._y < 0 ? -1 : 0) | 0;
height = height + (height < 0 ? -1 : 0) | 0;
height = height + (height < 0 ? -1 : 0) | 0;
}
var frame = this.sequence[this.frame] || 0;
var sheetY = frame + (frame < 0 ? -1 : 0) | 0;
var sheetX = (frame - sheetY) * this.spriteSheetX || 0;
s.drawImage(this.bitmap.image, this.bitmap.frameRect.x2 * sheetX, this.bitmap.frameRect.y2 * sheetY, this.bitmap.frameRect.x2, this.bitmap.frameRect.y2, x - (width * this._scaleX) * this.anchorX, y - (height * this._scaleX) * this.anchorY, width * this._scaleX, height * this._scaleY);
this.updateFrame();
};
更新
所以我下载了旧版本的 Chrome (25.0.1364.5),并运行了我的基准测试:
然后我在最新版本的 Chrome 中重新运行:
显然 Chrome 已经改变了。是故意的吗?我不知道。您可以看到,在旧版本的 Chrome 中,我实际上比原来的 4460 获得了更多的性能(+ ~400,我的优化肯定奏效了),但您也可以看到它让我悬停在 100% 的 cpu 使用率。 2x cpu 几乎是屏幕上的 2x 对象。
【问题讨论】:
-
这个不看相关代码就很难回答了。
-
1) 如果您正在搜索表演,请将图像放在画布中以获得 33% 的提升。 2) 屏幕坐标将始终 >=0,因此无需测试符号。如果坐标
-
我猜人们错过了我的问题......我不是想通过这个问题获得表现,我有各种各样的技巧。我不知道的是 Chrome 是如何改变其行为以最终将自身限制在 30fps 的。我只包含代码,因为人们一直在要求它。没有我的任何代码的示例...goodboydigital.com/pixijs/canvas/bunnymark 如果您在 Chrome 中运行它...您将看到它从 ~60fps 直接跳到 30fps 的点。这不是 Chrome 过去的行为方式。
-
“我有各种各样的技巧”。然而,你错过了一些重要的。
-
@GameAlchemist 哈,是的,你的权利。我之所以这么说是因为,这些年来,我做了很多这些优化,并且看到了浏览器之间的巨大差异,甚至版本号之间的差异,就像这个问题一样。如果该标志打开,您会看到
_s.snapToPixel实际上会舍入所有内容。在旧版本的 Safari 中,这曾经是一个巨大的改进,几乎是 2 倍,但现在我看到的收益非常小。我不是故意抹黑你的意见。实际上,我已经陷入了过度优化的陷阱,以至于我最终决定选择显而易见的那些,其余的 jsPerf 来寻找最佳折衷方案。
标签: javascript performance google-chrome html5-canvas