小编Koa*_*sta的帖子

适用于Android的Firemonkey游戏循环

我目前正在Firemonkey中为我的Android手机制作2D游戏,使用一些TImage控件并控制它们的位置和角度.就那么简单.我尝试使用我正常的循环方式,在Windows中运行良好/完美但在Android上运行失败.

方法#1:"无结束"循环(坏)

我的主要问题是我想通过使用这样的"无端循环"来避免不必要的/意外的行为,我必须调用它Application.ProcessMessages():

while (Game.IsRunning()) do
begin
  { Update game objects and stuff }
  World.Update();


  { Process window messages, or the window will not respond anymore obviously }
  Application.ProcessMessages(); { And thats what i want to avoid }
end;
Run Code Online (Sandbox Code Playgroud)

问题是,当我陷入循环并调用过程来处理消息时,我可能遇到很多问题,而且我也不认为这是一个好方法.

方法#2:TTimer(甚至不考虑它;-))

由于TTimer在很多方面都很糟糕而且并不意味着用于这样的事情,我只是将TTimer与最小间隔放在一起的方法就会失效.此外,我从未尝试过其他计时器,但如果有一个真正的游戏,我会尝试它当然:)

方法#3:OnIdle - 我在Windows上通常如何操作

在Windows上,我可以使用Application.OnIdle-Event.

procedure GameLoop(Sender: TObject; var Done: Boolean);
begin
  { Update game objects and stuff }
  World.Update();

  { Set done to false }
  Done := False;
end;

...

Application.OnIdle := GameLoop;
Run Code Online (Sandbox Code Playgroud)

每次应用程序在Windows消息上空闲时都会调用它.与#1相比,性能似乎相同或稍差,整体架构更可靠,这也是我通常使用此方法的原因.然而,在Android上,当与TForm.MouseMove结合使用时,它似乎被称为不同.在Windows OnIdle保持完美工作的地方,在Android上,它将滞后/停止,而TForm.MouseMove是从触摸输入调用的(RAD Studio自动将其编译为触摸事件) …

delphi android game-engine game-loop firemonkey

6
推荐指数
1
解决办法
881
查看次数

标签 统计

android ×1

delphi ×1

firemonkey ×1

game-engine ×1

game-loop ×1