0

stroke() または fill() の呼び出し後にパスをコピーするにはどうすればよいですか? そのようなキャッシングメカニズムをセットアップしました

ハイエンド ビジュアル オブジェクト クラス:

override void DrawDirect(canvas aCanvas)
{
    aCanvas.Line(...)
    aCanvas.Rectangle(...)
    // etc. 
    MyCache = aCanvas.GetPath(); // = canvas.Context.copy_Path()
    IsCached = true;
}

override void DrawCache(canvas aCanvas)
{
    aCanvas.DrawPath(MyCache); // = canvas.Context.appendPath...
}

スーパークラスには次のメソッドがあります。

voidDraw(canvas aCanvas)
{
    if(IsCached) DrawCache();
    else DrawDirect;
}

キャンバスはこの種のメソッドを定義します:

void Line(...)
{
    Context.moveTo(...)
    Context.lineTo(...)
    Context.stroke();
}

GetPath を呼び出すと、stroke() と fill() の呼び出しをコメントしない限り、MyCache.numData は 0 になります。しかし、副作用として、DrawDirect メソッドは (視覚的に) 何もしません。

それに続くもう 1 つの質問は、次のとおりです。appendPath の呼び出しは、基本的な「直接」メソッドの呼び出しよりも (本当に) 高速ですか? (これについてコメントすることができます。copy_Path に関する回答のみを受け付けます)。

4

1 に答える 1

0

Cairo には、ストローク後にパスを削除する stroke() と、パスに触れずにそのままにしておく stroke_preserve() があります。

appendPath() がパスを直接再作成するよりも速いかどうかはよくわかりませんが、このようなことがパフォーマンスの問題になるとは本当に想像できません。とにかくパスに依存する可能性が高く、これを自分でベンチマークする必要があります。

于 2013-08-18T18:21:31.767 に答える