[Bf-blender-cvs] [4397a7806a8] temp-T99136-benchmark-viewport-playback: Add eevee playback performance to benchmark.

Jeroen Bakker noreply at git.blender.org
Mon Jun 27 12:27:34 CEST 2022


Commit: 4397a7806a8f495f22b50a9d0ade9551bb5b619e
Author: Jeroen Bakker
Date:   Mon Jun 27 12:27:30 2022 +0200
Branches: temp-T99136-benchmark-viewport-playback
https://developer.blender.org/rB4397a7806a8f495f22b50a9d0ade9551bb5b619e

Add eevee playback performance to benchmark.

===================================================================

M	source/blender/makesrna/intern/rna_wm.c
M	tests/performance/tests/eevee.py

===================================================================

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



More information about the Bf-blender-cvs mailing list