Flash游戏计时器间隔变为一半

时间:2011-10-17 13:06:11

标签: performance flash actionscript-3

我们在动作脚本3中开发了一个Flash游戏,它在我们的远程服务器上的运行速度要慢得多。

游戏规格:

  • 6-8个不同的影片剪辑,所有1帧静态png文件,从10x10到​​100x100
  • 在任何给定时间,屏幕上有10到60个MC的实例
  • 事件循环从闪存定时器以25ms
  • 运行
  • 通过键盘进行所有互动

奇怪的是,我们发布了swf文件并在本地运行,一切都很快。我们将swf复制到远程服务器,一切运行得慢得多。音乐以正常速度播放,但影片剪辑都以大约一半的速度在屏幕上移动。

为什么从远程服务器获取文件时运行方式会有所不同?瑞士法郎总是在本地运行吗?此外,我们在本地和远程运行任务管理器运行它,它似乎没有消耗太多的CPU或内存。

编辑:好的,这真的很奇怪。我在游戏中添加了一个framecounter文本字段。它报告自上次计时器滴答以来的ms数。它一直报告50毫秒。我的计时器显然设置为25.这解释了半速,但是这解释了什么?我还在timer.Interval属性上添加了一个检查,以查看它是否已更改但它没有;游戏开始时它仍然设置为25。

DOUBLE EDIT!:我发现这篇文章:http://www.bit-101.com/blog/?p=910,并将我的代码切换为使用ENTER_FRAME而不是计时器,它可以正常工作。我得到完整的40fps,给予或采取几个%。但仍然不确定计时器有什么问题;如果它在我的循环中花费的时间被延迟它会波动,但事实并非如此。无论发生了多少,每次都是50ms。

这是我正在使用的代码(或多或少):

t = new Timer(25);
t.addEventListener(TimerEvent.TIMER, timerTick);
t.start();

并且在计时器刻度代码中我使用getTimer()来计算刻度之间的时间。每次出现50ms。

2 个答案:

答案 0 :(得分:1)

SWF始终由玩家在本地执行。我想到的可能的差异是:

  • 在本地使用桌面Flash Player,而不是插件/ activeX
  • swf不在同一个HTML页面中,在线版本可能包含其他Flash动画(广告)
  • 在线html页面将flash的wmode设置为透明,而本地的wmode将其设置为window

答案 1 :(得分:1)

我之前遇到过Timer类的一些问题,用它来运行我的游戏循环。什么是SWF的fps?我发现其中有两个是相互关联的。

以前,我以为我可以使用2的SWF FPS,同时设置Timer给我30FPS。发生的事情是SWF会勾选,它会检查Timer类。计时器可能会触发事件。然后,半秒后(SWF设置为2FPS),SWF将再次打勾。然后Timer类将尝试触发15个事件(Timer设置为30FPS)。它一次可以发射的事件似乎也有限制,因为它一次只发射其中的5个。

切换到ENTER_FRAME - 如果需要,它还可以限制帧速率。

此外,如果您尚未使用它,请学会使用增量时间来控制游戏对象的移动。

private var m_lastTime:int = 0;

private function _onEnterFrame( e:Event ):void
{
    var currTime:int        = getTimer();
    var deltaTime:Number    = ( currTime - this.m_lastTime ) * 0.001;
    this.m_lastTime         = currTime;

    // then, if you want your object to move at 10 pixels per second, it's:
    myObj.x += 10 * deltaTime;
}

然后,无论您的计算机速度如何,您的物体都将以恒定速度移动。

如果您正在制作物理游戏,那么您还需要考虑修改时间步以获得更一致的结果:http://gafferongames.com/game-physics/fix-your-timestep/

加分链接:http://www.8bitrocket.com/2008/04/08/tutorial-creating-an-optimized-as3-game-timer-loop/