Я работаю над библиотекой анимации, и время от времени я запускаю тестовый тест, чтобы узнать, какая часть прибыли или убытка я получаю с определенными функциями. Недавно я столкнулся с чем-то, что меня совершенно озадачило, возможно, кто-то с большим количеством знаний может осветить это для меня.Изменение производительности холста в Chrome
Производительность До:
- Chrome: ~ 4460 спрайты @ 30fps
- Safari: ~ 2817 спрайты @ 30fps
- FireFox: ~ 1273 спрайты @ 30fps
- iPhone 4S: ~ 450 @ 30fps
Peformance Now:
- Chrome: ~ 3000 спрайты @ 30fps
- Safari: ~ 2950 спрайты @ 30fps
- FireFox: ~ 1900 спрайты @ 30 кадров в секунду (до Garbage Collection становится слишком отвлекают)
- iPhone 4S: ~ 635 @ 30fps
Итак, вы можете видеть, что Chrome сильно пострадал от производительности, в то время как каждый другой браузер, похоже, немного улучшился за это время. Самая большая вещь, которую я замечаю, и то, что я считаю, - это ответ, что использование ЦП, похоже, заглохло в Chrome (я клянусь, прежде чем я смогу подняться почти на 90%, теперь его максимальная около 60%). Большинство процессоров используется для вызова drawImage()
, и я не уверен, что могу что-то сделать для его оптимизации.
Если это просто проблема, когда Chrome теперь ограничивает использование моего процессора, я в порядке.
Любое понимание было бы весьма признателен ...
_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();
};
UPDATE
Я скачал старую версию Chrome (25.0.1364.5), и побежал мой эталонный тест:
Затем я переработал в самой последней версии Chrome:
Ясно, что Chrome изменился. Это было специально? Я не знаю. Вы можете видеть, что в старой версии Chrome я на самом деле получил больше производительности по сравнению с моими оригинальными 4460 (+ ~ 400, мои оптимизации, должно быть, сработали), но вы также можете увидеть, что это позволяет мне набирать 100% -ный процессор. 2x cpu почти 2x объект на экране.
Это будет трудно ответить, не видя соответствующего кода. –
1) если вы ищете возможности, поместите изображение внутри холста на 33%. 2) координаты экрана всегда будут> = 0, поэтому нет необходимости проверять знак. Если координата <0, то обрабатывайте отсечение правильно или не рисуйте, если вне экрана. 3) вы можете обойти ширину, высоту, указанную в последних аргументах drawImage, чтобы получить более высокую скорость. 4) вы можете захотеть кэшировать в холст масштабированную версию вашего изображения, чтобы, наконец, выполнить ничью 1: 1. – GameAlchemist
Я предполагаю, что людям не хватает моего вопроса ... Я не пытаюсь добиться успеха с этим вопросом, для этого у меня есть всевозможные трюки. То, о чем я не знал, было то, как Chrome изменил свое поведение, чтобы в конечном итоге опуститься до 30 кадров в секунду. Я только включил код, потому что люди продолжают его просить. Пример без моего кода ... http://www.goodboydigital.com/pixijs/canvas/bunnymark/, если вы запустите это в Chrome ... вы увидите момент, когда он перескочит с ~ 60 кадров в секунду до 30 кадров в секунду. Это не то, как Chrome использует себя. – ericjbasti