首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

DelphiX 入門(4):TDXTimer 高效能計時器實現流暢動畫

     編輯:Delphi

前言

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

完整範例:TrackBar 動態調整幀率,隨機繪製橢圓

TDXTimer 動畫示範

單元程式碼

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.

關鍵差異:TDXTimer vs TTimer

特性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 遊戲主迴圈。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved