Blender3D中更高效的Python脚本

Blender3D中更高效的Python脚本,python,performance,blender,processing-efficiency,Python,Performance,Blender,Processing Efficiency,我基本上是使用原始UV球体构建一个3D散点图,在尝试一次创建超过几百个点时遇到内存问题。我的笔记本电脑只有2.1Ghz的处理器,但我想知道是否有更好的方法来编写: import bpy import random while count < 5: bpy.ops.mesh.primitive_uv_sphere_add(size=.3,\ location=(random.randint(-9,9), random.randint(-9,9),\ random.

我基本上是使用原始UV球体构建一个3D散点图,在尝试一次创建超过几百个点时遇到内存问题。我的笔记本电脑只有2.1Ghz的处理器,但我想知道是否有更好的方法来编写:

import bpy
import random 

while count < 5:
    bpy.ops.mesh.primitive_uv_sphere_add(size=.3,\
    location=(random.randint(-9,9), random.randint(-9,9),\
    random.randint(-9,9)), rotation=(0,0,0))

    count += 1 
导入bpy
随机输入
当计数小于5时:
bpy.ops.mesh.primitive\u uv\u sphere\u add(大小=.3\
位置=(random.randint(-9,9),random.randint(-9,9)\
random.randint(-9,9)),旋转=(0,0,0))
计数+=1

我意识到,使用这样一个简单的脚本,任何性能的提高都可以忽略不计,但我还是想尝试一下

一些可能的建议

  • 我会预先计算x,y,z值,将它们存储在mathutil向量中,并将其添加到要迭代的dict中
  • 复制应提供比复制更小的内存占用 实例化新对象
    bpy.ops.object.duplicate\u move(object\u OT\u duplicate=(链接:false,TRANSFORM\u OT\u translate=(TRANSFORM)
编辑:

做进一步的研究,每次一个bpy.ops.*被称为redraw函数时,它都会出现。一位用户记录了生成UV球体所需时间的指数级增长

CoDEmanX向另一个用户提供了以下代码片段

import bpy

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


for i in range(-1000, 1000, 2):
    ob = sphere.copy()
    ob.location.y = i
    #ob.data = sphere.data.copy() # uncomment this, if you want full copies and no linked duplicates
    bpy.context.scene.objects.link(ob)
bpy.context.scene.update()
然后,它只是调整代码以设置对象位置的一个例子

obj.location = location_dict[i]

是的。太棒了。就我现在所做的来说,复制它实际上更有意义——应该会在动画中产生很好的效果。谢谢!