动作脚本3.如何防止Flash游戏中的滞后问题?

时间:2015-03-18 19:05:55

标签: sql performance actionscript-3 flash lag

如何防止Flash游戏中的滞后问题?例如,如果游戏有倒数计时器1分钟,玩家必须抓住那么多可能的物品。

以下是滞后问题:

  • 如果物品移动(没有静态位置) - 那个较高的滞后玩家 有,那些较慢的物品移动;
  • 当玩家有滞后时(CPU使用率为90-100%),计时器开始计数缓慢。

所以例如如果没有滞后的玩家可以获得100分,那么慢/坏计算机的玩家可以获得4-6倍,例如400-600。


我认为,因为它是在客户端,但如何将它移动到服务器端?我应该向数据库插入(并更新)倒计时时间吗?但是如何在每毫秒更新它?

物品位置解决方案怎么样?如果玩家有很大的滞后,物品移动得非常慢,那么轻松点击它,有什么想法吗?

2 个答案:

答案 0 :(得分:0)

将功能移至服务器端并不能解决问题。 现在,如果有很多玩家连接到服务器,服务器将会滞后并给予这些玩家更多时间做出反应。

要使逻辑与滞后无关,请不要将其基于屏幕更新。 因为这假定屏幕更新(或帧)之间的时间恒定

相反,根据帧之间传递的实际时间来制作逻辑。 使用getTimer来测量当前帧和最后一帧之间经过的时间。 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/package.html

当然,你的逻辑应该包括帧之间发生的事情的计算。

答案 1 :(得分:0)

为了主要修复客户端上的速度问题,您需要根据实际时间而不是帧来制作所有与速度相关的代码。例如:

以下是用于根据框架移动对象的相当典型的示例代码:

// speed = pixels per frame
var xSpeed:Number = 5;
var ySpeed:Number = 5;

addEventListener(Event.ENTER_FRAME, update);

function update(e:Event):void {
    player.x += xSpeed;
    player.y += ySpeed;
}

虽然这个代码对于单个客户端来说简单而且足够好,但它非常依赖于帧速率,并且正如您所知,帧速率非常有弹性"实际帧速率受客户端CPU速度的影响很大。

相反,下面是一个示例,其中移动基于实际经过的时间:

// speed = pixels per second
var xSpeed:Number = 5 * stage.frameRate;
var ySpeed:Number = 5 * stage.frameRate;

var lastTime:int = getTimer();

addEventListener(Event.ENTER_FRAME, update);

function update(e:Event):void {
    var currentTime:int = getTimer();
    var elapsedSeconds:Number = (currentTime - lastTime) / 1000;
    player.x += xSpeed * elapsedSeconds;
    player.y += ySpeed * elapsedSeconds;

    lastTime = currentTime;
}

此处的关键部分是使用getTimer()跟踪当前时间,每次更新都会根据实际经过的时间而不是固定金额来移动player。我将xSpeedySpeed设置为5 * stage.frameRate以说明它如何与其他示例相同,但您不必这样做。最终结果是,无论实际帧速率如何,第二个示例都将具有一致的移动速度。