11# Required for rendering initialization, not necessary for
22# local rendering, but doesn't hurt to include it
33import asyncio
4+ import time
45
56import vtkmodules .vtkRenderingOpenGL2 # noqa
67from trame .app import TrameApp , asynchronous
3940"""
4041
4142
43+ def time_now_ms () -> int :
44+ return int (time .time_ns () / 1000000 )
45+
46+
4247class ConeApp (TrameApp ):
4348 def __init__ (self , server = None ):
4449 super ().__init__ (server )
4550
4651 self .server .cli .add_argument ("--encoder" , default = "turbo-jpeg" ) # jpeg
4752 args , _ = self .server .cli .parse_known_args ()
4853 self .state .encoder = args .encoder
54+ self .state .stats = None
55+ self .state .stats_display = ""
56+ self .max_dt = 0
4957
5058 self .render_window , self .cone_source = self .setup_vtk ()
5159 self .build_ui ()
@@ -81,6 +89,20 @@ async def _animate(self):
8189 self .view_handler .update ()
8290 await asyncio .sleep (1 / int (self .state .target_fps ))
8391
92+ @change ("stats" )
93+ def on_stats (self , stats , ** _ ):
94+ if stats is None :
95+ self .state .stats_display = ""
96+ return
97+
98+ now = time_now_ms ()
99+ ds = now - stats .get ("st" )
100+ self .max_dt = max (self .max_dt , ds )
101+ fps = stats .get ("fps" )
102+ self .state .stats_display = (
103+ f"round-trip: { int (ds )} [{ self .max_dt } ] ms - fps: { fps } "
104+ )
105+
84106 @change ("playing" )
85107 def on_playing (self , playing , ** _ ):
86108 if playing :
@@ -89,6 +111,7 @@ def on_playing(self, playing, **_):
89111 @change ("target_fps" )
90112 def on_target_fps (self , target_fps , ** _ ):
91113 self .view_handler .target_fps = target_fps
114+ self .max_dt = 0
92115
93116 @change ("max_pixel_count" )
94117 def on_max_pixel_count (self , max_pixel_count , ** _ ):
@@ -112,6 +135,8 @@ def build_ui(self):
112135 footer .add_child ("Quality ({{quality[0]}}/{{quality[1]}})" )
113136 v3 .VSpacer ()
114137 footer .add_child ("Encoder ({{encoder}})" )
138+ v3 .VSpacer ()
139+ footer .add_child ("{{ stats_display }}" )
115140
116141 with layout .toolbar :
117142 v3 .VSpacer ()
@@ -205,6 +230,8 @@ def build_ui(self):
205230 with client .SizeObserver ("size" ):
206231 view = rca .RemoteControlledArea (
207232 display = "image" ,
233+ monitor = "10" ,
234+ stats = "stats = $event" ,
208235 )
209236 self .view_handler = view .create_view_handler (
210237 self .render_window ,
0 commit comments