Начните с этой модификации:
scratchPercentage: function($this)
{
var hits = 0;
var imageData = $this.ctx.getImageData(0,0,$this.canvas.width,$this.canvas.height).data
var pixels = imageData.length;
for(var i=0, ii=pixels; i<ii; i=i+4)
{
if(
imageData[i] == 0 &&
imageData[i+1] == 0 &&
imageData[i+2] == 0 &&
imageData[i+3] == 0
) hits++;
}
return hits / ($this.pixels) * 100;
}
У меня нет удобной ссылочной ссылки для этого, но поддержание дескриптора в вашем массиве данных Canvas избавляет ваш цикл от необходимости определять местоположение данных пикселейна каждой итерации.Это на самом деле приводит к значительному повышению производительности.Точно так же, хотя это и не так важно, вы также можете назначить переменную для размера вашего массива, чтобы вам не приходилось разрешать значение после каждой итерации цикла.
Помимо этих двух изменений, я недумаю, что вы можете сделать scratchPercentage()
более стройным.Не зная подробностей того, как ваш холст меняется от кадра к кадру, я не могу предложить какие-либо оптимизации только для расчета изменений.В зависимости от ваших требований к точности, вы можете рассмотреть возможность проверки каждого другого пикселя.
Я также могу придумать примерное решение WebGL, но оно не будет простым.В конечном итоге, если вы не располагаете какой-либо достоверной информацией о том, что изменилось между текущим и предыдущим кадрами, вы не сможете заранее рассчитать этот процент или значительно ускорить его.
Изменить: В зависимости от размера вашего холста, вы можете попытаться изменить размер его копии в памяти до 50% и сделать ваши расчеты на этом.Оно не будет идеальным, но оно должно быть относительно точным.