我正在玩一些 Delphi + openGL。因为我比较懒,所以想用 FireMonkey 给我做个表格。
所以我做了一个 FireMonkeyHD 应用程序,初始化了 GL,渲染了一个基本的立方体......并发现了一些奇怪的行为。当我不移动鼠标时,我得到大约 10FPS。当我移动鼠标时,性能轻松提升到 500FPS 甚至(显然)更高。那会是什么?
*注意:我在主线程中使用 onKeyDown 事件开始渲染......
为了更好地理解,两张图片:
一些代码:
unit Unit1;
interface
uses
{ ... }
;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
Shift: TShiftState);
private
degen
: IDeGEn;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
var
DeGEnFactory
: TDeGEnFactory;
begin
{ ... }
// Load DeGEn
degen := DeGEnFactory.newDeGEn(WindowHandleToPlatform(Form1.Handle).Wnd);
// Initialize
degen.get3D.init(600, 800);
degen.get3D.setOnRender(function : Boolean
var
v3d
: R3DVector;
begin
Result := true;
self.Caption := IntToStr(degen.get3D.getFPS);
v3d.z := 0.01;
degen.get3D.getCamera.move(v3d);
degen.get3D.renderTest;
end);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// Shut down DeGEn
{ ... }
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
Shift: TShiftState);
begin
// Start rendering
degen.startRendering;
end;
end.
startRendering
看起来像这样:
procedure TDeGEn.startRendering;
var
msg
: TMsg;
begin
if isRendering then
begin
Exit;
end;
isRendering := true;
while GetMessage(msg, 0, 0, 0) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
if not degen3D.render then
begin
Break;
end;
end;
isRendering := false;
end;
您可能很容易注意到,相机只是以取决于 FPS 的速度远离立方体。此外,我将 FPS 显示为表单标题。