2011-10-17 79 views
0

我们在ActionScript 3中开发了一款Flash游戏,它在我们的远程服务器上运行速度要慢得多。Flash游戏计时器时间间隔变为一半

游戏规格:

  • 6-8不同的电影剪辑,从屏幕上的那些管委会的10至60的实例在任何给定的时间
  • 所有1帧静态PNG文件,从10×10 100×100
  • 任何地方
  • 事件循环从闪存定时器在25ms的
  • 运行所有的交互是通过键盘

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

从远程服务器获取文件时为什么文件运行不同?不是swf总是在本地运行吗?另外,我们在任务管理器运行的情况下在本地和远程运行它,它似乎并不占用太多的CPU或内存。

编辑:好的,这真的很奇怪。我在游戏中添加了一个framecounter文本框。它报告自上次计时器打勾后的毫秒数。它始终如一地报告50ms。我的计时器显然设置为25.这解释了半速,但是解释了这一点?我还在timerInterval属性上添加了一个检查,以查看它是否已经更改并且没有;游戏运行时它仍然设置为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。

+0

你尝试了您的计时器一点点。尝试100毫秒,如果事件还在继续,它会有另一个勾号,它应该跳过。 – 2011-10-17 15:57:45

回答

1

我以前也有一些问题与Timer类,用它来运行我的游戏循环。什么是你的SWF的fps?我发现他们中的2个被链接。

以前,我认为我可以使用2的SWF FPS,同时设置定时器给我30FPS。发生了什么事情是SWF会勾选它,它会检查Timer类。计时器可能触发一个事件。然后,半秒钟后(SWF设置为2FPS),SWF将再次打勾。 Timer类将尝试触发15个事件(定时器被设置为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/

1

SWF总是由玩家在本地执行。浮现在我的脑海里可能存在的差异是:

  • 在本地使用桌面Flash播放器,而不是插件/ ActiveX
  • 的SWF是不是在同一个HTML网页,在线版本可能包括其他Flash动画(广告)
  • 在线HTML页面设置闪光灯的的wmode透明,而当地的一个将其设置为窗口