Python PIL libでは、私は使用しています
>>> draw.ellipse((x - r, y - r, x + r, y + r))
円をノードとして描画します。ただし、描画するノードが数千あるため、時間がかかりすぎます。
すべてのノードを描画するより速い方法はありますか?
背景: 円をノードとして、ツリー状のグラフを描画します。
Python PIL libでは、私は使用しています
>>> draw.ellipse((x - r, y - r, x + r, y + r))
円をノードとして描画します。ただし、描画するノードが数千あるため、時間がかかりすぎます。
すべてのノードを描画するより速い方法はありますか?
背景: 円をノードとして、ツリー状のグラフを描画します。
サイクルごとに多くの楕円を描くと遅くなります。
PIL を使用する必要がある特定の理由はありますか? 質問の詳細から、PIL があなたのタスクに適しているかどうかはわかりません。画像操作ライブラリではなく、グラフィック ライブラリが必要です。違いがあります。
PyGameは、高性能描画ルーチンに適した SDL ラッパーです。
いくつかのトリックには、サーフェスに一度描画してから、ダーティ リージョンのみを再描画することが含まれます。これのチュートリアルはここにあります:
グラフィックプログラミングに慣れていないほとんどの人は、最初のオプションを使用します。つまり、フレームごとに画面全体を更新します。問題は、これがほとんどの人にとって容認できないほど遅いことです。
解決策は「ダーティ rect アニメーション」と呼ばれます。フレームごとに画面全体を更新するのではなく、最後のフレーム以降に変更された部分のみを更新します。
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)