1

ゲームがあり、2000 x 4000 ブロックのマップを初期化しています。これは onLoad で 1 回だけ実行され、約 700 ミリ秒かかります。どうすれば高速化できますか?他のロジックはこのマップに依存します。コードは次のとおりです。

var start = new Date();
var g = {};
g.world = { h:2000, w:4000, cellInfo: [] };
var i, j,
    world = g.world,
    hlim = world.h,
    wlim = world.w,
    cellInfo = world.cellInfo;
for ( i = hlim; i; i--) {
    cellInfo[i] = [];
    for (j = wlim; j; j--) {
        cellInfo[i][j] = 1;
    }
}
g.world.cellInfo = cellInfo;
alert(new Date() - start);​

ここにフィドルがあります:http://jsfiddle.net/NSX9z/

4

1 に答える 1

6

あなたのためのいくつかのオプション:

怠惰な初期化

それをスピードアップするための最善の策は、代わりに遅延初期化を使用することです。たとえば、800万のスロットすべてを初期化する代わりに、それらが存在しない場合は、それらに依存するコードで処理します。例:セルを取得するには

function getCell(x, y) {
    var row, cell;

    row = cellInfo[x];
    if (!row) {
        row = cellInfo[x] = [];
    }

    cell = row[y];
    if (typeof cell === "undefined") {
        cell = row[y] = 1; // 1 appears to be the default value
    }

    return cell;
}

...および同様ですsetCell。それはinitを広げます。もちろん、それは物事が少し遅いことを意味しますが、それは知覚できる違いではないでしょう。

アレイのクローン作成

そうしない場合は、別のオプションとして、4,000スロットの配列を一度作成してから、手動で作成するのではなくクローンを作成します。これにより、JavaScriptエンジン内で作業を行う方が、実際のループを自分で行うよりも高速になります。

// ...
var the4k = [];
// ...build it...
// Now use it for one row and clone it for the others
cellInfo[hlim] = the4k;
for ( i = hlim - 1; i; i--) {
    cellInfo[i] = the4k.slice(0);
}

アレイのクローン作成は私にとって劇的にスピードアップします。Chromeは約780ミリ秒から約130ミリ秒、IE9は約530ミリ秒から約50ミリ秒になります。

考慮すべきもう1つの問題は、IE8以前では、「遅いスクリプトの警告」は時間ではなく、操作の数に基づいているということです。あなたのフィドルは私にIE8の遅いスクリプト警告を与えます。私のはしません。

IE8は、私のバージョンのフィドルでさえ実行するのに9秒近くかかるので、lazy-initを主張しています。

于 2012-12-04T12:16:28.220 に答える