2

Python PIL libでは、私は使用しています

>>> draw.ellipse((x - r, y - r, x + r, y + r))  

円をノードとして描画します。ただし、描画するノードが数千あるため、時間がかかりすぎます。
すべてのノードを描画するより速い方法はありますか?

背景: 円をノードとして、ツリー状のグラフを描画します。

4

2 に答える 2

5

サイクルごとに多くの楕円を描くと遅くなります。

PIL を使用する必要がある特定の理由はありますか? 質問の詳細から、PIL があなたのタスクに適しているかどうかはわかりません。画像操作ライブラリではなく、グラフィック ライブラリが必要です。違いがあります。

PyGameは、高性能描画ルーチンに適した SDL ラッパーです。

いくつかのトリックには、サーフェスに一度描画してから、ダーティ リージョンのみを再描画することが含まれます。これのチュートリアルはここにあります

グラフィックプログラミングに慣れていないほとんどの人は、最初のオプションを使用します。つまり、フレームごとに画面全体を更新します。問題は、これがほとんどの人にとって容認できないほど遅いことです。

解決策は「ダーティ rect アニメーション」と呼ばれます。フレームごとに画面全体を更新するのではなく、最後のフレーム以降に変更された部分のみを更新します。

于 2012-12-21T09:05:15.517 に答える
2

image.paste() で速度が約 5 倍向上することがわかりました。オーバーラップを避ける透過的な問題があるため、マスクは速度を少し遅くします。

def init_circle(r):
    center = [r] * 2
    im = Image.new(IMG_MODE, [r * 2] * 2, FG_COLOR)
    draw = ImageDraw.Draw(im) 
    draw.setink(BG_COLOR)
    draw.ellipse((1, 1, r * 2 - 1, r * 2 - 1), fill=NODE_COLOR)
    mask = invert(im.convert('L'))
    return im.crop((0, 0) + (r * 2, r * 2)), mask

それを使用するには:

im.paste(circle, (x, y, x + 2 * r, y + 2 * r), mask=mask)
于 2012-12-25T07:27:28.837 に答える