У меня есть эта функция для рисования объекта спрайта (который является просто объектом с массивом значений пикселей):
this.draw = (ctx, x, y, scale) => {
let i = 0;
let startIndex, red, green, blue, alpha, currentX, currentY;
while(i < this.size.width * this.size.height){
startIndex = i * 4;
red = this.pixArray[startIndex];
green = this.pixArray[startIndex + 1];
blue = this.pixArray[startIndex + 2];
alpha = this.pixArray[startIndex + 3];
// Draw, but not if the pixel is invisible
if(alpha != 0){
ctx.fillStyle = `rgba(${red}, " + ${green} + ", " + ${blue} + ", " + ${alpha / 255.0} + ")`;
currentX = i % this.size.width;
currentY = (i - currentX) / this.size.width;
ctx.fillRect(Math.round(x + (currentX * scale)), Math.round(y + (currentY * scale)),
Math.round(scale), Math.round(scale));
}
i++;
}
}
Единственное, чего здесь не хватает, это pixArray
, который является Uint8Arrayзначений пикселей.
Однако производительность довольно плачевная.Я обнаружил, что часть производительности теряется из-за изменения состояния холста (ctx.fillStyle
), но необходимо, чтобы я изменял эту каждую итерацию.Даже если fillStyle остается неизменным, производительность по-прежнему неприемлема.Я понимаю, что у меня есть возможность или предварительный рендеринг, но я хочу избежать этого.