My fastest code:
for (var y=y1; y>=y0; --y) {
var resultY = (0.5+
(level.topLeft.y - camera.position.y + camera.screen.height / 2 +
level.cellHeight + y * level.cellHeight-level.cellHeight)
)|0; // fast clip to int
for (var x=x1; x>=x0; --x) {
var tileImageNo = level.layers[z].cells.valueAt([x, y])-1;
if (tileImageNo==null || tileImageNo<=0) {
//nothing to do
} else {
ctxOnScreenCanvas.drawImage(
tiles[tileImageNo],
(0.5+
(level.topLeft.x - camera.position.x + camera.screen.width / 2 +
level.cellWidth + x * level.cellWidth- level.cellWidth)
)|0, // fast clip to int
resultY
);
}
}
}
I've also tried drawing to OffScreenCanvas in the loop, and then drawing that canvas to screen, but it was slower.I could try drawing to off screen canvas only when player moves out off current off screen canvas, but that will trade small delay each turn into big delay every N turns, and that's even worse. But I'll try that.
EDIT: cuting out not important code.