2011-12-07 20 views
1

我有以下功能写成游戏模拟的一部分:一旦没有呈现任何更多做一个JS功能在使用setInterval块,直到计时器消失

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

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

    frames = 0; 

     timerID = window.setInterval(doFrame, 25); 
} 

计时器清零。我想能够运行该功能n倍,像这样:

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

然而,据initialize()而言它只要定时器设置返回,因此运行10次仅仅只有结束最后一次迭代运行完成。

我怎么让initialize()阻塞,直到定时器运行,这样我可以连续运行功能n次?

编辑:

这是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 '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()与你希望它运行但很多次的争论。