DispatcherTimer 基於 UI 執行緒分派器,每隔固定間隔觸發 Tick 事件,類似 CompositionTarget.Rendering 但間隔可自由設定 (毫秒級),優先級可調 (DispatcherPriority),極適合角色個體邏輯:移動、戰鬥、施法、狀態機更新。
Rectangle rect;
double speed = 5;
Point moveTo;
public Window3()
{
InitializeComponent();
rect = new Rectangle { Fill = Brushes.Red, Width = 50, Height = 50, RadiusX = 5, RadiusY = 5 };
Carrier.Children.Add(rect);
Canvas.SetLeft(rect, 0); Canvas.SetTop(rect, 0);
var dt = new DispatcherTimer(DispatcherPriority.Normal);
dt.Tick += Timer_Tick;
dt.Interval = TimeSpan.FromMilliseconds(50); // 20 FPS
dt.Start();
}
private void Carrier_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
moveTo = e.GetPosition(Carrier);
}
private void Timer_Tick(object sender, EventArgs e)
{
double x = Canvas.GetLeft(rect);
double y = Canvas.GetTop(rect);
Canvas.SetLeft(rect, x + (x < moveTo.X ? speed : -speed));
Canvas.SetTop(rect, y + (y < moveTo.Y ? speed : -speed));
}
四行核心初始化:new DispatcherTimer、+= Tick、Interval、Start()。邏輯極簡:每幀向目標點移動固定像素 speed。
| 引擎 | 基礎機制 | 間隔控制 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|---|---|
| Storyboard | 時間軸插值 | 聲明式 Duration | 簡單屬性漸變、位移、縮放、旋轉 | XAML/Code 皆宜、GPU 加速、自動插值 | 難以表達複雜邏輯分支 |
| CompositionTarget.Rendering | 每幀渲染後回調 | 固定 (螢幕刷新率 ~60Hz) | 全域同步更新、粒子系統、攝影機跟隨 | 與幀同步、無額外計時器 | 間隔不可控、高頻觸發易卡頓 |
| DispatcherTimer | UI 分派器計時器 | 自由設定 (毫秒)、優先級可調 | 角色個體 AI、幀動畫、狀態機、技能冷卻 | 參數靈活、邏輯集中、優先級隔離 | 非 GPU 級插值、需手動計算插值 |