diff options
author | Jeroen Bakker <jeroen@blender.org> | 2022-06-27 13:27:30 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2022-06-27 13:27:30 +0300 |
commit | 4397a7806a8f495f22b50a9d0ade9551bb5b619e (patch) | |
tree | 7471e2482868354278e96da7247491c32b0574a2 | |
parent | b56eb338961d38817706941a2a82034f5dc88224 (diff) |
Add eevee playback performance to benchmark.
-rw-r--r-- | source/blender/makesrna/intern/rna_wm.c | 1 | ||||
-rw-r--r-- | tests/performance/tests/eevee.py | 132 |
2 files changed, 102 insertions, 31 deletions
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index 3ff9e6be3ce..aea5900280d 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -138,6 +138,7 @@ const EnumPropertyItem rna_enum_wm_job_type_items[] = { {WM_JOB_TYPE_RENDER_PREVIEW, "RENDER_PREVIEW", 0, "Rendering previews", ""}, {WM_JOB_TYPE_OBJECT_BAKE, "OBJECT_BAKE", 0, "Object Baking", ""}, {WM_JOB_TYPE_COMPOSITE, "COMPOSITE", 0, "Compositing", ""}, + {WM_JOB_TYPE_SHADER_COMPILATION, "SHADER_COMPILATION", 0, "Shader compilation", ""}, {0, NULL, 0, NULL, NULL}, }; diff --git a/tests/performance/tests/eevee.py b/tests/performance/tests/eevee.py index 4081510fe29..569afd9a7c6 100644 --- a/tests/performance/tests/eevee.py +++ b/tests/performance/tests/eevee.py @@ -1,48 +1,118 @@ # SPDX-License-Identifier: Apache-2.0 -import api import os +import enum +import time -def _run(args): - import bpy - import time +class RecordStage(enum.Enum): + INIT = 0, + WAIT_SHADERS = 1, + WARMUP = 2, + RECORD = 3, + FINISHED = 4 - start_time = time.time() - elapsed_time = 0.0 - num_frames = 0 - while elapsed_time < 10.0: - scene = bpy.context.scene - for i in range(scene.frame_start, scene.frame_end + 1): - print(i) - scene.frame_set(i) +WARMUP_SECONDS = 3 +WARMUP_FRAMES = 10 +SHADER_FALLBACK_SECONDS = 60 +RECORD_SECONDS = 10 +LOG_KEY = "ANIMATION_PERFORMANCE: " - num_frames += scene.frame_end + 1 - scene.frame_start - elapsed_time = time.time() - start_time - time_per_frame = elapsed_time / num_frames +def _run(args): + import bpy - result = {'time': time_per_frame} - bpy.ops.wm.quit_blender() + global record_stage + record_stage = RecordStage.INIT + bpy.app.handlers.frame_change_post.append(frame_change_handler) + bpy.ops.screen.animation_play() -class EeveeTest(api.Test): - def __init__(self, filepath): - self.filepath = filepath + +def frame_change_handler(scene): + import bpy + + global record_stage + global start_time + global start_record_time + global start_warmup_time + global num_frames + global stop_record_time + + if record_stage == RecordStage.INIT: + screen = bpy.context.window_manager.windows[0].screen + for area in screen.areas: + if area.type == 'VIEW_3D': + space = area.spaces[0] + space.shading.type = 'RENDERED' + space.overlay.show_overlays = False + + start_time = time.perf_counter() + record_stage = RecordStage.WAIT_SHADERS + + elif record_stage == RecordStage.WAIT_SHADERS: + shaders_compiled = False + if hasattr(bpy.app, 'is_job_running'): + shaders_compiled = not bpy.app.is_job_running("SHADER_COMPILATION") + else: + # Fallback when is_job_running doesn't exists by waiting for a time. + shaders_compiled = time.perf_counter() - start_time > SHADER_FALLBACK_SECONDS + + if shaders_compiled: + start_warmup_time = time.perf_counter() + num_frames = 0 + record_stage = RecordStage.WARMUP + + elif record_stage == RecordStage.WARMUP: + num_frames += 1 + if time.perf_counter() - start_warmup_time > WARMUP_SECONDS and num_frames > WARMUP_FRAMES: + start_record_time = time.perf_counter() + num_frames = 0 + record_stage = RecordStage.RECORD + + elif record_stage == RecordStage.RECORD: + current_time = time.perf_counter() + num_frames += 1 + if current_time - start_record_time > RECORD_SECONDS: + stop_record_time = current_time + record_stage = RecordStage.FINISHED - def name(self): - return self.filepath.stem + elif record_stage == RecordStage.FINISHED: + bpy.ops.screen.animation_cancel() + elapse_seconds = stop_record_time - start_record_time + avg_frame_time = elapse_seconds / num_frames + fps = 1.0 / avg_frame_time + print(f"{LOG_KEY}{{'time': {avg_frame_time}, 'fps': {fps} }}") + bpy.app.handlers.frame_change_post.remove(frame_change_handler) + bpy.ops.wm.quit_blender() + - def category(self): - return "eevee" +if __name__ == '__main__': + _run(None) + +else: + import api + class EeveeTest(api.Test): + def __init__(self, filepath): + self.filepath = filepath - def run(self, env, device_id): - args = {} - _, log = env.run_in_blender(_run, args, [self.filepath], foreground=True) - return {'time':1.0} + def name(self): + return self.filepath.stem + def category(self): + return "eevee" -def generate(env): - filepaths = env.find_blend_files('eevee/*') - return [EeveeTest(filepath) for filepath in filepaths] + def run(self, env, device_id): + args = {} + _, log = env.run_in_blender(_run, args, [self.filepath], foreground=True) + for line in log: + if line.startswith(LOG_KEY): + result_str = line[len(LOG_KEY):] + result = eval(result_str) + return result + return {'time': 'UNKNOWN'} + + def generate(env): + filepaths = env.find_blend_files('eevee/*') + return [EeveeTest(filepath) for filepath in filepaths]
\ No newline at end of file |