2011-12-07 6 views
1

を消えるまで、私はゲームのシミュレーションの一環として書かれた以下の機能を持っていたsetIntervalブロックとのJS関数を作成します。しかし、限りinitialize()が、それは、すぐにタイマーが設定されているとして返します懸念しているので、それを10回実行すると、単にだけで終わるは、タイマーが

for (var i = 0; i < n; i++) { 
     initialize(); 
    } 

:私はこのように、この関数にn回実行できるようにしたいと思います最後の反復は完了まで実行されます。

initialize()は、タイマーがそのコースを実行するまでブロックするので、私は連続してn回の機能を実行できますか?

EDIT:ここ

はdoFrame()コードです。条件が満たされると、タイマーが停止します。

function doFrame() { 
    date = new Date(); 
    startTime = date.getTime(); 

    moveSwarm(); 
    renderSwarm(); 

    if (numAgents == 0) { 
     window.clearTimeout(timerID); 

     //Calculate average frames per second 
     date = new Date(); 
     var elapsedTime = (date.getTime() - overallStartTime)/1000; 
     frameRate = frames/elapsedTime; 
    } else if (frames % 5 == 0) { 
     calculateFramerate(); 
    } 

    showFramerate(); 

    frames++; 
} 
+0

なぜ 'initialize'を10回連続して実行したいですか?一度だけ呼び出すか、すべてをリセットする必要があるかのように思えます(たとえば、なぜキャンバスを10回初期化するのですか?)あなたのコードを少し再構築して、初期化を一度だけ実行し、 'setInterval'をon最後に 'doFrame'ですか?たぶん私はポイントを見逃しているかもしれません... –

+0

最終的にインターバルタイマーを停止させるコードを見る必要があります。このコードでは、何かを開始するためにinitialize()をもう一度呼び出すことになります。 – jfriend00

+0

ああ、申し訳ありませんが、doFrame()コードを少し更新します。これは、レンダリングエンジンをテストするコードのプロファイリングを行っているからです。コードの1回の実行の平均FPSを計算します。私は 'n'を実行するだけで、最適化などをテストできることを計算できるようにしたいと思っています。私は、エンジンのナットとボルトをあまりにも邪魔することなく、 。 – javanix

答えて

0

initialize()ニーズ再帰的に呼び出されると、あなたはsetTimeout代わりのsetIntervalを必要とする:あなたはそれを実行したいが何回もの引数で

function initialize(n) { 
    setMaxAgents($('#maxAgents').val()); 
    initCanvas(); 
    initSwarm(); 
    renderSwarm(); 

    date = new Date(); 
    overallStartTime = date.getTime(); 

    frames = 0; 

    if (n > 0) { 
     timerID = window.setTimeout(function() { 
      doFrame(); 
      initialize(n--); 
     }, 25); 
    } 
} 

コールinitialize()