[Bf-python] Fastest way for RenderEngine to return combined rgba + z

Asbjørn lordcrc at gmail.com
Mon Aug 19 16:59:04 CEST 2013


On 01.02.2013 19:25, Brecht Van Lommel wrote:
> There is already a trick that you can use, it didn't work entirely
> before but I just committed a fix for that. Basically you use the
> foreach_set method which accepts a buffer object:
> http://www.blender.org/documentation/blender_python_api_2_65_9/bpy.types.bpy_prop_collection.html?highlight=foreach_get#bpy.types.bpy_prop_collection.foreach_set

I've finally gotten around to implementing this, and it does indeed work 
nicely.

On a single 1920x1080 image with alpha and depth (zbuffer), it takes 
about 1.2 seconds total to update and transfer the image to the render 
result. About 400 ms is spent on our side tonemapping etc and converting 
to bottom-up format (internally we store top-down). The remainder, about 
800 ms, is spent getting the result into Blender using the foreach_set. 
This was measured in different ways on my i7 2700k.

The old method which returned a list of lists uses about 6-8 seconds on 
the same image, and considerably more memory. So indeed a nice boost there.

Two catches:

- foreach_set requires that the object not only follows the buffer 
protocol but also a subset of the sequence protocol. Specifically it has 
to pass PySequence_Check() which requires sq_item to be assigned, and 
foreach_set itself requires a valid sq_length implementation as it uses 
PySequence_Size(). Those are the only two PySequenceMethods fields that 
needs to be filled though.

- As mentioned you have to assign all layers and passes in one go. We 
don't support multiple layers yet but we're talking about it, so it 
would be nice to be able to assign each layer individually using a buffer.

Thanks again for the assistance.

- Asbjørn



More information about the Bf-python mailing list