0

私はthsのようなwhileループを持っています:

var running_time = 0;
var start_time = new Date();
while( cars.length > 0 )
{
    this.update(null, running_time)
    for(var i in cars )
    {
        var car = cars[i];
        car.delay = 0;
        car.update(start_time, this)
    } 

    for( var i in cars_to_remove )
    {
        var index = cars.indexOf(cars_to_remove[i]);
        if( index > -1 )
        {
            cars.splice(index, 1);
        }
    }
    cars_to_remove.splice(0, cars_to_remove.length);
    running_time++;
}
var end_time = new Date();

ここで行っているのは、車の動きと信号機のアニメーションをシミュレートしていることです。ループは、すべての車が目的地に到着するまで実行されます。車が目的地に到着すると、車の配列から削除するようにマークされます (2 番目のループを参照)。

while ループにブレークポイントを指定してこの while ループをデバッグすると、running_time 変数は通常 90 前後ですが、while ループにブレークポイントがなく、上記の例の最後の行にブレークポイントを設定すると、running_time 変数の値はさらに数千になります。 (約12000)。

キャッチはどこですか?

4

1 に答える 1

0

cars_to_remove完成した車をアレイにプッシュしていません。(または、表示されたコードから欠落しているだけですか?)

アニメーションを更新する関数でsetTimeout/を使用していますか? setInterval車の位置の更新にタイムアウトが含まれている場合、ブレークポイントでデバッグして待機するときに行われる反復は、通常の実行よりも少なくなります。

通常、これは次のいずれかの方法で行う必要があります。

Method1 (疑似コード)

while(condition){
    calculatePosition();
    updatePosition();
}

function updatePosition(){
    if(condition){
       marktoRemove();
    }else{
       setTimeout(function(){
           updateDisplay();
       }, delay);
       delay += 100; // for e.g.
    }
}

Method2 (疑似コード) - While ループなし

setTimeout(function(){

    calculatePosition();

    if(condition){
       marktoRemove();
    }else{
       updateDisplay();
    }     

}, delay);

2 番目の方法をお勧めします。

于 2012-08-14T19:00:15.793 に答える