У меня есть этот кусок холста анимации, выставляющаяся некоторые странные характеристики:Является ли context.clearRect() действительно ЭТО дорого?
http://jsbin.com/olasol/2/edit
Я на последнюю версию Chrome. Я использую встроенный монитор FPS от Chrome (вы можете активировать его, перейдя на about:flags
). я пометил строку в разделе JavaScript, который я думаю, что это потенциальный преступник:
fallingctx.clear();
Эта линия не делает ничего особенного. Он вызывает функцию, которая в свою очередь вызывает clearRect()
.
В "странные" вещи, которые я замечаю, являются:
clear();
функция вызывает очень заметное падение фпс на моем ноутбуке (Core 2 Duo), но не на моем рабочем столе (i5 2500K).Для снятия этой линии достаточно производить 60 кадров в секунду на моем ноутбуке. Как и ожидалось, холст не очищается после каждого кадра, но все же он создает стабильные 60 кадров в секунду.
Откат FPS происходит только тогда, когда мое окно Chrome находится на большой стороне! Когда я сжимаю окно и перезаряжаю, этого не происходит! (Разве дороже очистить большой прямоугольник?).
Я попытался заменить
clear()
наdrawImage()
полного белого JPEG, чтобы покрыть холст. JavaScript способен выполнять 200drawImage()
выполнение каждого цикла для меньших частиц изображения (что видно из второй точки). Однако, когда я добавляю одинdrawImage
для всего холста, он снова отстает! (Убедитесь, что выходной сигнал занимает весь экран, чтобы воспроизвести результат.)
Почему все это происходит? Как это исправить?
Обратите внимание, что вещь 'window.requestAnimationFrame' не обязательно должна быть в функции. Кроме того, не используйте 'new Object()', и использование синтаксиса точек для доступа к свойствам вместо скобок, вероятно, является хорошей идеей. – Ryan
Расширение прототипа такого рода вещей также, вероятно, то, что вы не должны делать. – Ryan
Итак, в высокопроизводительной настройке вы расширяете собственный объект с помощью метода, который обращается к this.canvas ..., который * может вызвать некоторые проблемы. Это лучше? http://jsbin.com/olasol/12/edit – Ryan