3

Is it possible to ask blender when each render tile starts/finishes rendering?

e.g. for a render time estimator

This used to be somewhat possible from the command line:

For example in blender 2.65a the elapsed time was printed, along with what tile was being traced:

Fra:1 Mem:12.59M (9.89M, peak 27.51M) | Mem: 6.82M, Peak: 6.96M | Scene, RenderLayer | Elapsed: 00:04.28 | Rendering | Path Tracing Tile 10/135
Fra:1 Mem:12.59M (9.89M, peak 27.51M) | Mem: 6.82M, Peak: 6.96M | Scene, RenderLayer | Elapsed: 00:04.41 | Rendering | Path Tracing Tile 11/135
Fra:1 Mem:12.59M (9.89M, peak 27.51M) | Mem: 6.96M, Peak: 6.96M | Scene, RenderLayer | Elapsed: 00:04.56 | Rendering | Path Tracing Tile 12/135
Fra:1 Mem:12.59M (9.89M, peak 27.51M) | Mem: 6.82M, Peak: 6.96M | Scene, RenderLayer | Elapsed: 00:05.99 | Rendering | Path Tracing Tile 13/135

though now with later versions of blender the elapsed time is no longer printed.
while you might be able to read blender's output with a script and get the time, is this possible with python?

Is there any way to get similar information to what is printed in the terminal with python?

gandalf3
  • 157,169
  • 58
  • 601
  • 1,133

2 Answers2

4
from datetime import datetime
from bpy.app import handlers

TIMER = None

def start_timer(scene):
    global TIMER
    TIMER = datetime.now()

def elapsed(dummy):
    print("Elapsed:", datetime.now() - TIMER)

handlers.render_pre.append(start_timer)
handlers.render_stats.append(elapsed)

Example output:

Elapsed: 0:00:10.819869
Fra:1 Mem:7.10M (9.89M, Peak 17.07M) | Mem:1.21M, Peak:1.29M | Scene, RenderLayer | Path Tracing Tile 133/135
Elapsed: 0:00:10.863458
Fra:1 Mem:7.10M (9.89M, Peak 17.07M) | Mem:1.29M, Peak:1.29M | Scene, RenderLayer | Path Tracing Tile 134/135
Elapsed: 0:00:10.931486
Fra:1 Mem:7.10M (9.89M, Peak 17.07M) | Mem:1.21M, Peak:1.29M | Scene, RenderLayer | Path Tracing Tile 135/135
Elapsed: 0:00:11.466759
Fra:1 Mem:7.10M (9.89M, Peak 17.07M) | Mem:0.02M, Peak:1.29M | Scene, RenderLayer | Finished
Elapsed: 0:00:11.467813
Fra:1 Mem:7.08M (9.89M, Peak 17.07M) Sce: Scene Ve:0 Fa:0 La:0
Elapsed: 0:00:11.841684
Saved: /tmp/0001.png Time: 00:11.84 (Saving: 00:00.37)
Aldrik
  • 9,720
  • 22
  • 56
2

As far as I know, this is not currently accessible from the Python API (and I looked, because I'd love to add that to my Render Time Estimation add-on (shameless plug, I know)).

Fweeb
  • 7,202
  • 2
  • 32
  • 37
  • Perhaps there is some way to read the output with a script and feed that to python? (hacky, I know..) BTW, awesome addon, I use that all the time :) – gandalf3 Aug 29 '13 at 20:54
  • Worth investigating... will take a gander. Also, thank you. :) – Fweeb Aug 29 '13 at 22:09
  • Did a quick check... in order for that to work, you'd need to run Blender as a Python subprocess and capture the strings that print to standard out. A better solution would probably be to add an event handler on the C side that fires each time a tile finishes... but even then you'd have to time each tile in C and expose that data to Python (since Python runs single-threaded in Blender, it can't reliably time multiple rendering tiles on multi-core system). – Fweeb Aug 30 '13 at 06:45