|
Delphi2010 Direct2D(3) 2010/12/09 |
それではもう少し、Direct2Dについて見ていきます。
ヘルプによると、TDirect2DCanvasのプロパティには下記があるとの事。
property RenderTarget: ID2D1RenderTarget read GetRenderTarget; | このキャンバス オブジェクトのレンダリング対象を示します。 |
property Brush: TDirect2DBrush read GetBrush write SetBrush; | グラフィック図形や背景を塗りつぶすための色とパターンを決定します。 |
property Pen: TDirect2DPen read GetPen write SetPen; | 線を引いたり図形の輪郭を描くためにキャンバスが使用するペンの種類を指定します。 |
property Font: TDirect2DFont read GetFont write SetFont; | キャンバス上にテキストを書くときに使用するフォントを指定します。 |
線などを描画するには、まず、ペン(Pen)から見ていきます。「TDirect2DPen」とありますので、WindowsGDIの「TPen」とは別物、というのはすぐに想像出来ます。
ペン(Pen)のプロパティはヘルプによると下記のようになっているようです。
property Brush: TDirect2DBrush read GetBrush write SetBrush; | 線を描画するときに使用するブラシを示します。 |
property Color: TColor read GetColor write SetColor; | キャンバス上に線を描画するときに使う色を示します。 |
property StrokeStyle: ID2D1StrokeStyle read FStrokeStyle; | ペンで線を描画するときのストローク スタイルを示します。 |
property Style: TPenStyle read GetStyle write SetStyle; | ペンで線を描画するときのスタイルを示します。 |
property Width: Integer read FWidth write FWidth; | ペンの幅をピクセル単位で示します。 |
色(Color)プロパティは、これまで同様、TColor型との事ですから、「clWhite」「clBlue」等や $00AABBCC のような値、RGB(r,g,b) 等で扱えます。線種(Style)プロパティも同様に TPenStyle型との事ですから下記(ヘルプより)が利用出来るのでしょう。
psSolid | 実線。 |
psDash | 一連のダッシュで描かれた線。 |
psDot | 一連のドットで描かれた線。 |
psDashDot | ダッシュとドットが交互に描かれた線。 |
psDashDotDot | 一連のダッシュと 2 つのドットの組み合わせで描かれた線。 |
psClear | 線は描かれない(現在のペンを使用して輪郭を描いた形の、周りの線を省くために使用する)。 |
psInsideFrame | 幅が 1 より大きい場合にディザリングした色が使用される実線。 |
psAlternate | ペンは他のピクセルをすべて塗りつぶす。このスタイルはコスメティック ペンにのみ適用できる。このスタイルは ExtCreatePen API 関数で作成されたペンにのみ有効である(MS Windows SDK 資料を参照)。これは VCL と VCL.NET の両方に適用される。 |
psUserStyle | ペンはユーザーが用意したスタイル配列を使用する。 |
ヘルプには、点線や破線は 線幅(Width)が「1」である場合にのみ有効とありますが実際にやってみると、線幅が「1」より大きくても破線は描画されるようです。
GDIでは、線の描画は、「MoveTo(X,Y)」で始点指定、「LineTo(X,Y)」で終点指定をして行いました。Direct2Dでも同じくこれを利用出来ますが、DrawLineメソッドというものもあります。
ボタンを1つ追加し、下記のようなイベントハンドラを記述して実行してみました。
procedure TForm1.Button2Click(Sender: TObject);
var
px,py : integer ;
i : integer ;
p1,p2 : D2D_POINT_2F ;
t : TDateTime ;
mes : string ;
begin
if not(D2DCanvasFlag) then exit;
px := PaintBox1.ClientWidth ;
py := PaintBox1.ClientHeight ;
mes:= '' ;
// Direct2D
t := Now ;
D2DCanvas.BeginDraw;
with D2DCanvas do begin
for i:=0 to px*10 do begin
Pen.Color := RGB(Random(256),Random(256),Random(256));
Pen.Style := psSolid ;
Pen.Width := 1;
MoveTo(0,0);
LineTo(i,py);
end;
for i:=0 to px*10 do begin
Pen.Color := RGB(Random(256),Random(256),Random(256));
Pen.Style := psSolid ;
Pen.Width := 1;
MoveTo(px,0);
LineTo(i,py);
end;
end;
D2DCanvas.EndDraw;
mes := 'LineTo実線:' + TimeToStr(Now - t) ;
t := Now ;
D2DCanvas.BeginDraw;
with D2DCanvas do begin
for i:=0 to px*10 do begin
Pen.Color := RGB(Random(256),Random(256),Random(256));
Pen.Style := psSolid ;
Pen.Width := 1;
p1.x := 0 ;
p1.y := 0 ;
p2.x := i ;
p2.y := py ;
DrawLine(p1,p2);
end;
for i:=0 to px*10 do begin
Pen.Color := RGB(Random(256),Random(256),Random(256));
Pen.Style := psSolid ;
Pen.Width := 1;
p1.x := px ;
p1.y := 0 ;
p2.x := i ;
p2.y := py ;
DrawLine(p1,p2);
end;
end;
D2DCanvas.EndDraw;
mes := mes + ' DrawLine実線:' + TimeToStr(Now - t) ;
StatusBar1.SimpleText := mes ;
end; |
線を描かせて単純に比較するだけのプログラムです。これを実行すると、
のようになります。感覚的には、実線・線幅=1の場合は、「MoveTo(X,Y)」〜「LineTo(X,Y)」と DrawLineメソッドとの違いはほとんど感じません。画面をリサイズすると描画がどんどん遅くなるのが分かります。線幅を「5」に変更して実行すると下記のようになります。
若干不思議ですが、線幅が大きい方が、描画速度も速いようです。次に線種を「psDash」に変更して実行してみました。
実線(psSolid)よりも破線(psDash)の方がかなり遅くなった、という感じになります。画面を大きくすればするほど、どんどん遅くなります。実行状態?によって速度は変わるのですが、この場合、DrawLineメソッドの方が遅い場合が多いようです。
また、StrokeStyleプロパティは、より複雑な(細かい)設定をした線種を指定することが出来るようです。ヘルプに詳細説明を見つけることが出来なかったため現在はよく分かりませんが…。このプロパティを利用する場合は、Styleプロパティと同時利用は出来ません。
しかし、悲しいかな、線幅=1の状態では、同じプログラムをGDIで作成した方が、当方のパソコンでは高速な状態となってしまっています。(Core2Duo2Ghz、VGA:ATI MD4670) 線幅=2以上・実線描画の場合は、Direct2Dの方が速いようです。自動的にアンチエイリアスが掛かってその処理に線幅=1だとやりにくい、みたいな感じなのでしょうか?よく分かりませんが、Direct2Dを使う場合は、線幅の最小は「1」ではなく「2」とした方が良いのかもしれません。
|
|
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
▲2010/12/08
2010/12/09
▼2010/12/10
シェアウェア
Script!World
データベース
|