如何防止闪存游戏中的滞后性问题?例如,如果游戏有倒计时1分钟,玩家必须抓住尽可能多的项目。
以下是以下滞后bug问题:
例如,如果没有延迟的玩家可以得到100分,电脑慢/坏的玩家可以多得到4-6倍,比如400-600。
我认为这是因为它在客户端,但是如何将它移到服务器端呢?我应该在数据库中插入(并更新)倒计时时间吗?但是如何在每毫秒上更新呢?
那么项目定位解决方案呢?如果玩家有很大的滞后,项目移动非常慢,所以很容易点击,你有什么想法吗?
发布于 2015-03-18 19:17:12
将功能转移到服务器端并不能解决问题。现在,如果有许多玩家连接到服务器上,那么服务器就会滞后,并给这些玩家更多的时间做出反应。
要使您的逻辑独立于滞后,请不要将其建立在屏幕更新的基础上。因为这假设屏幕更新(或帧)之间的时间是恒定的。
相反,根据帧之间的实际时间来制定逻辑。使用getTimer来度量当前帧到最后一个帧之间传递的时间。US/FlashPlatform/reference/actionscript/3/flash/utils/package.html
当然,您的逻辑应该包括帧之间发生的情况的计算。
发布于 2015-03-18 21:45:01
为了主要解决客户端的速度问题,您需要根据实际时间(而不是帧)编写所有与速度相关的代码。例如:
下面是一个非常典型的示例代码,用于根据框架移动对象:
// 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。我将xSpeed和ySpeed设置为5 * stage.frameRate,以说明它如何与另一个示例相匹配,但您不必这样做。最终结果是,无论实际帧速率如何,第二个示例的移动速度都是一致的。
https://stackoverflow.com/questions/29130637
复制相似问题