我们在动作脚本3中开发了一个Flash游戏,它在我们的远程服务器上的运行速度要慢得多。
游戏规格:
奇怪的是,我们发布了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。
答案 0 :(得分:1)
SWF始终由玩家在本地执行。我想到的可能的差异是:
答案 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/