2

このスクリプトを実行すると:

import bpy, time
t0 = time.time()

for i in range(1000):
    bpy.ops.mesh.primitive_uv_sphere_add()

    if i % 100 == 0:
        print(time.time()-t0)
        t0 = time.time()

これは出力です(指数関数的成長対時間):

1.1920928955078125e-05
0.44658803939819336
0.46373510360717773
0.5661759376525879
0.7258329391479492
0.9994637966156006
1.381392002105713
1.8257861137390137
2.4634311199188232
3.2817111015319824

なぜこれが起こるのですか?より良いアプローチはありますか?

十分なメモリを備えたサーバーでこれを実行していますが、Blender が拡張してそのほとんどを使用できることを知っています (レンダリングで使用します)。

4

1 に答える 1

1

簡単な答え:

bpy.ops.object.select_all(action='DESELECT')
bpy.ops.mesh.primitive_uv_sphere_add()
sphere = bpy.context.object

for i in range(1000):
    ob = sphere.copy()
    ob.data = sphere.data.copy()
    bpy.context.scene.objects.link(ob)
bpy.context.scene.update()

説明:

にあるものはbpy.ops.*すべて、呼び出しごとにシーンを再描画します。これらをループで呼び出すことは避けたいと考えています。上記のスクリプトはcopy()、再描画しない下位レベルのメソッドを呼び出します。リンクされた複製が必要な場合は、sphere.data.copy()行を削除できます。

この解決策は私自身のものではありません。この回答については、 BlenderArtists のCoDEmanXに感謝します!

于 2012-11-25T19:54:49.717 に答える