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

DelphiX 教學 (24):掌握 TDirectDrawSurface 的 Blt 與 BltFast 高效繪圖技巧

     編輯:Delphi

在 DelphiX 開發中,TDirectDrawSurface 的 Blt() 與 BltFast() 是兩個核心位元區塊傳輸函數,雖然功能相似,但參數複雜度與適用場景大不相同。本文將透過實戰範例,深入解析這兩個函數的用法差異與效能特性。

函數特性快速比較

  • Blt():功能完整,支援縮放、鏡像、色鍵透明、光柵運算等進階效果,參數較多,適合複雜繪圖需求。
  • BltFast():精簡高效,僅支援基本位元複製與色鍵透明,不支援縮放與特效,但執行速度極快,適合大量精靈快速繪製。

實戰範例程式碼

以下範例示範如何使用這兩個函數將來源圖片繪製到主要繪圖表面:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DXDraws, StdCtrls, DirectX;

type
  TForm1 = class(TForm)
    DXDraw1: TDXDraw;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  ImgPath1 = 'C:\Temp\DelphiX.bmp';  // 來源圖片
  ImgPath2 = 'C:\Temp\Test.bmp';     // 背景圖片

procedure TForm1.Button1Click(Sender: TObject);
var
  MySurface: TDirectDrawSurface;
  DF: TDDBltFX;
begin
  // 建立臨時表面並載入來源圖片
  MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
  try
    MySurface.LoadFromFile(ImgPath1);
    DXDraw1.Surface.LoadFromFile(ImgPath2);

    // 設定 Blt 特效結構
    DF.dwSize := SizeOf(DF);
    DF.dwDDFX := 0;

    { 使用 Blt 進行縮放繪製 (目標矩形為來源的一半大小)
       參數說明:
       1. 目標矩形
       2. 來源表面
       3. 來源矩形
       4. 標誌:DDBLT_KEYSRC(色鍵透明) + DDBLT_WAIT(等待完成)
       5. 特效結構 }
    DXDraw1.Surface.Blt(
      Rect(0, 0, MySurface.Width div 2, MySurface.Height div 2),
      MySurface.ClientRect,
      DDBLT_KEYSRC or DDBLT_WAIT,
      DF,
      MySurface
    );

    DXDraw1.Flip;  // 翻轉顯示
  finally
    FreeAndNil(MySurface);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  MySurface: TDirectDrawSurface;
begin
  MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
  try
    MySurface.LoadFromFile(ImgPath1);
    DXDraw1.Surface.LoadFromFile(ImgPath2);

    { 使用 BltFast 快速繪製 (帶縮放效果需自行計算矩形)
       參數說明:
       1. 目標 X 座標
       2. 目標 Y 座標
       3. 來源矩形 (這裡取 90% 區域)
       4. 標誌:DDBLTFAST_SRCCOLORKEY(來源色鍵) + DDBLTFAST_WAIT
       5. 來源表面 }
    DXDraw1.Surface.BltFast(
      0, 0,
      Bounds(16, 4, Trunc(MySurface.Width * 0.9), Trunc(MySurface.Height * 0.9)),
      DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT,
      MySurface
    );

    DXDraw1.Flip;
  finally
    FreeAndNil(MySurface);
  end;
end;

end.

關鍵技術重點

  1. 記憶體管理:務必使用 try...finally 確保 TDirectDrawSurface 正確釋放,避免 DirectDraw 介面洩漏。
  2. 色鍵透明:兩個函數皆支援色鍵透明 (Source Color Key),需確保來源表面已正確設定 ColorKey 屬性。
  3. 效能選擇:大量精靈渲染時優先考慮 BltFast;需要縮放、旋轉、Alpha 混合等特效時才使用 Blt。
  4. 等待旗標:DDBLT_WAIT / DDBLTFAST_WAIT 確保繪製完成才返回,防止畫面撕裂。

Blt 與 BltFast 效果示範

透過本範例可見,Blt 適合需要幾何變換的場景,而 BltFast 則是高效能 2D 遊戲渲染的首選。實際開發中應根據具體需求靈活選用。

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