多くの変数をキャッシュすることを提案したいくつかの回答のおかげで、私は描画を30msから20msに変更しました。
しかし、今日はObject.keys()を削除することで、なんとか1msに到達しました。キーが含まれる範囲がわかったので、xとlenXを変更して範囲を事前に選択しました。yとlenYも同じです。ロード時間は、マトリックスのサイズにほとんど比例しません。(私は100倍大きいマトリックスをテストしましたが、2ミリ秒しかかかりません)。
minX = Math.floor(cameraPos.x/blockSize)*blockSize;
minY = Math.floor(cameraPos.y/blockSize)*blockSize;
maxX = minX+WIDTH+blockSize;
maxY = minY+HEIGHT+blockSize;
for(var col = minX; col < maxX; col+=blockSize) { // Run through cols
for(var row = minY; row < maxY; row+=blockSize) { // Run though rows
if(typeof matrix[col] !== "undefined" && typeof matrix[col][row] !== "undefined"){
drawRect(xFix(col),yFix(row),blockSize,blockSize,blockColors[matrix[col][row]]);
}
}
}
関数は非常に高速ですが、最終的にはスケーリングを開始します。すべてのスケーリングを削除し、理論的にはゲームマップを途方もなく大きくすることができるようにするために、カメラが特定の距離をスクロールするたびにマップをキャッシュし始めました(現在は画面の幅が2倍になっていますが、それ以上になる可能性があります) )。キャッシュする領域はこれと同様の機能でフィルタリングされるため、ほぼ瞬時に実行されます。
var cached = [];
function cacheMap() {
if(cached['pos'] === undefined || cameraPos.x < cached['pos']['x']-WIDTH || cameraPos.x > cached['pos']['x']+WIDTH || cameraPos.y < cached['pos']['y']-HEIGHT || cameraPos.y > cached['pos']['y']+HEIGHT) {
cached['map'] = filterMatrix(map,cameraPos.x-WIDTH-blockSize*5,cameraPos.y-HEIGHT-blockSize*5,WIDTH*3+blockSize*10,HEIGHT*3+blockSize*10);
cached['pos'] = {'x':cameraPos.x,'y':cameraPos.y};
console.log('cached map');
}
}