VCL TTimer 精度受限於 Windows 訊息佇列,Interval 低於 50ms 即不準確。DelphiX TDXTimer 直接掛鉤 DirectDraw 翻轉事件,可將 Interval := 0 表示「盡可能快」,適合遊戲主迴圈。

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DXClass, DXDraws, ComCtrls;
type
TForm1 = class(TForm)
DXDraw1: TDXDraw;
DXTimer1: TDXTimer;
TrackBar1: TTrackBar;
procedure FormCreate(Sender: TObject);
procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
procedure TrackBar1Change(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
DXDraw1.Align := alClient;
TrackBar1.Align := alBottom;
TrackBar1.Height := 23;
TrackBar1.Min := 0;
TrackBar1.Max := 500;
TrackBar1.Position := TrackBar1.Max div 2;
DXTimer1.Interval := TrackBar1.Position;
Randomize;
end;
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var
x1, y1, x2, y2: Integer;
begin
if not DXDraw1.CanDraw then Exit;
x1 := Random(DXDraw1.Width);
y1 := Random(DXDraw1.Height);
x2 := Random(DXDraw1.Width);
y2 := Random(DXDraw1.Height);
DXDraw1.Surface.Fill(0); { 清除背景為黑色 }
with DXDraw1.Surface.Canvas do
begin
Brush.Color := Random($FFFFFF); { 隨機顏色 }
Ellipse(x1, y1, x2, y2);
Release; { 必須釋放 Canvas }
end;
DXDraw1.Flip; { 雙緩衝翻轉 }
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
DXTimer1.Interval := TrackBar1.Position; { 0 = 全速 }
end;
end.
| 特性 | TTimer (VCL) | TDXTimer (DelphiX) |
|---|---|---|
| 計時來源 | Windows WM_TIMER 訊息 | DirectDraw 垂直同步/翻轉事件 |
| 最小 Interval | ~10-15 ms(實際 ~50 ms) | 0(不限制,依硬體刷新率) |
| 精度 | 低,受訊息佇列擁塞影響 | 高,同步顯示器刷新率 |
| LagCount 參數 | 無 | 有,指示落後幀數,可用於幀率補償 |
| 適用場景 | UI 定時更新、非即時任務 | 遊戲主迴圈、即時動畫、視訊播放 |
遊戲物理邏輯建議使用固定時間步長(如 1/60 秒),渲染與邏輯分離:
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
const
FIXED_DT = 16; { ~60 FPS }
var
i: Integer;
begin
for i := 1 to LagCount + 1 do
GameLogic(FIXED_DT); { 追上落後的邏輯幀 }
RenderFrame;
end;
TDXTimer 是 DelphiX 實現高幀率動畫的核心元件。理解其 Interval=0 全速模式與 LagCount 補償機制,能編寫出流暢、穩定的 2D 遊戲主迴圈。