我目前正在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自动将其编译为触摸事件) …