gpt4 book ai didi

actionscript-3 - ActionScript 3/Flash : Basic Game Loop Stuttering Problems

转载 作者:行者123 更新时间:2023-12-03 03:38:08 32 4
gpt4 key购买 nike

我正在尝试使用 Flash 和 Actionscript 3 制作一个基本游戏。

到目前为止,我一直致力于打造流畅的游戏循环,但遇到了问题。我尝试实现一个固定的时间戳循环,看到:http://gafferongames.com/game-physics/fix-your-timestep/以及 Flixel。

我现在遇到的主要问题是,在屏幕上移动一个简单的对象会产生明显的卡顿。我的目标是获得更流畅的体验,但似乎无法弄清楚问题是什么。

主循环在 Event.ENTER_FRAME 上以 60 fps 的速度调用。

首先实例化这些变量:

public var total:uint = 0;
public var fixedDT:Number = 1000.0/60.0; //Shoot for 60 FPS in MS
public var accumulator:int = 0;
public var maxAccumulation:uint = 120;

这是每个 ENTER_FRAME 上的主循环:

//Most times are in ms
var mark:uint = getTimer();
var elapsedMS:uint = mark-total;
total = mark;

accumulator += elapsedMS;
if(accumulator > maxAccumulation){
accumulator = maxAccumulation;
}

while(accumulator > fixedDT){
step();
accumulator = accumulator - fixedDT;
}

//Convert from ms to secs. to interpolate graphics drawing (linear interpolation)
renderGameState(accumulator/fixedDT/1000.0);

step() 只是用固定的增量时间更新每个游戏对象。游戏对象更新函数很简单,如下:

//First part is just updating the previous position for graphic interpolation
position.x += velocity.x*deltaTime;
position.y += velocity.y*deltaTime;

对于渲染,我只是绘制 bitmap.copyPixel。我提到的图形插值是使用基本的线性插值函数,该函数使用 prev./curr.位置和 deltaTime 来计算绘制 X/Y。

 public function render(bitmap:BitmapData, deltaTime:Number, xOff:Number, yOff:Number):void{
this.x = lerp(prevPosition.x,position.x,deltaTime) + xOff;
this.y = lerp(prevPosition.y,position.y,deltaTime) + yOff;

bitmap.copyPixels(bitmapData, bitmapData.rect,new Point(this.x,this.y),null,null,true);
}


public function lerp(v0:Number, v1:Number, t:Number):Number {
return (1-t)*v0 + t*v1;
}

但是,出现了明显的卡顿现象。在下图中,我在绘制位图之前没有清除位图。您应该能够看到渲染的圆圈间距之间存在很大差异,有时甚至非常明显。

/image/00c39.png

如果有任何帮助,我将不胜感激,谢谢!

最佳答案

我不知道这是否有帮助,但这是我用来修复时间步长的代码。

private var _pause          :Boolean;
private var _prevTimeMS :int;
private var _simulationTime :Number;

override public function update():void
{
super.update();

if (!_pause)
{
var curTimeMS:uint = getTimer();
if (curTimeMS == _prevTimeMS)
{
return;
}
var deltaTime:Number = (curTimeMS - _prevTimeMS) / 1000;
if (deltaTime > 0.05)
{
deltaTime = 0.05;
}
_prevTimeMS = curTimeMS;
_simulationTime += deltaTime;
while (space.elapsedTime < _simulationTime)
{
// Your game step goes here.
_space.step((stage.frameRate > 0) ? (1 / stage.frameRate) : (1 / 60));
}
}
}

(最初取自 Nape Physics 样本)

关于actionscript-3 - ActionScript 3/Flash : Basic Game Loop Stuttering Problems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23401922/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com