感谢一些建议缓存大量变量的答案,我将绘图从 30 毫秒缩短到 20 毫秒。
但是今天我设法通过删除 Object.keys() 将其缩短到 1 毫秒,并且因为我知道键所在的范围,所以我更改了 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]]);
}
}
}
尽管该功能非常快,但它最终会开始缩放,为了消除所有缩放并且理论上能够使游戏地图大得离谱,我开始在每次相机滚动一定距离时缓存地图(现在它是屏幕宽度的两倍,但可能更多)。由于要缓存的区域使用与此类似的功能进行过滤,因此几乎可以立即完成。
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');
}
}