由於一些答案,暗示緩存很多變數我完成的繪圖採取30毫秒爲20ms去。
但是今天我設法去除Object.keys()得到它的1ms的和我知道的範圍內的按鍵將是我改變x和聯欣預選的範圍內。與y和lenY一樣。加載時間幾乎不會隨着矩陣的大小而縮放。 (我已經測試了一個100倍大的矩陣,它只開始需要2ms)。
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]]);
}
}
}
雖然功能非常快,它最終開始縮放,消除所有的縮放和在理論上能夠使遊戲地圖可笑的大,我開始每當攝像機滾動一定距離時,緩存地圖(現在是兩次屏幕寬度,但可能會更多)。由於要緩存的區域使用與此類似的功能進行過濾,因此幾乎可以立即完成。
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');
}
}
那麼「matrix [col]」緩存呢? –
@ kitgui.com - 我也加了一個。 – jfriend00