android "游戏循环" 帧速,适用于Android的Firemonkey游戏循环

我认为一个有效的选择是实现TAnimation并覆盖ProcessAnimation.通过TAnimator运行时会自动安排TAnimation.

TGameLoop = class(TAnimation)

protected

procedure ProcessAnimation; override;

end;

[...]

procedure TGameLoop.ProcessAnimation;

begin

//call updates

end;

并像这样开始:

procedure TForm1.FormCreate(Sender: TObject);

begin

FLoop := TGameLoop.Create(Self);

FLoop.Loop := True;

FLoop.Name := 'GameLoop';

FLoop.Parent := Self;

TAnimator.StartAnimation(Self, 'GameLoop');

end;

默认情况下,动画的FPS设置为60.我现在无法弄清楚的一件事是如何通过仅使用TAnimation的属性来计算自上次调用以来的Deltatime.这个对于处理可变帧时间至关重要.但是,你自己使用System.Diagnostics.TStopwatch自己做.在ProcessAnimation开始时停止观察并获得Ticks,在完成ProcessAnimation后开始一个新的.

编辑:

Deltatime的基本示例(自上次呼叫以来的经过时间,以秒为单位).鉴于您在Form1上放置了一个ViewPort3D,添加了名为Cube1的TCube,TGameLoop与Form1(我知道,丑陋但Demopurpose)在同一单元中声明,TGameLoop具有类型为TStopWatch的Field FWatch.

procedure TGameLoop.ProcessAnimation;

var

LDelta: Single;

begin

FWatch.Stop;

LDelta := FWatch.ElapsedTicks / FWatch.Frequency;

Form1.Cube1.RotationAngle.Y := Form1.Cube1.RotationAngle.Y + 50*LDelta;

FWatch := TStopwatch.StartNew();

end;

EDIT2:一个更好的例子,可以在整个游戏生命周期中更好地分配舍入/测量错误.我们从第一帧开始测量,而不是仅在测量之间进行测量. TGameLoop有一个新的Field FLastElapsedTicks(Double)

procedure TGameLoop.FirstFrame;

begin

FWatch := TStopWatch.StartNew();

end;

procedure TGameLoop.ProcessAnimation;

var

LDelta: Single;

LTickDelta, LElapsed: Double;

begin

LElapsed := FWatch.ElapsedTicks;

LTickDelta := LElapsed - FLastElapsedTicks;

FLastElapsedTicks := LElapsed;

LDelta := LTickDelta / FWatch.Frequency;

Form1.Cube1.RotationAngle.Y := Form1.Cube1.RotationAngle.Y + 50*LDelta;

end;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值