ui: add startup profiling (#36482)

* ui: add startup profiling

* lil more
pull/36488/head
Adeeb Shihadeh 2 weeks ago committed by GitHub
parent e92e59ca78
commit 94ca077e69
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 92
      system/ui/lib/application.py

@ -6,6 +6,7 @@ import signal
import sys import sys
import pyray as rl import pyray as rl
import threading import threading
from contextlib import contextmanager
from collections.abc import Callable from collections.abc import Callable
from collections import deque from collections import deque
from dataclasses import dataclass from dataclasses import dataclass
@ -170,37 +171,68 @@ class GuiApplication:
self._window_close_requested = True self._window_close_requested = True
def init_window(self, title: str, fps: int = _DEFAULT_FPS): def init_window(self, title: str, fps: int = _DEFAULT_FPS):
def _close(sig, frame): with self._startup_profile_context():
self.close() def _close(sig, frame):
sys.exit(0) self.close()
signal.signal(signal.SIGINT, _close) sys.exit(0)
atexit.register(self.close) signal.signal(signal.SIGINT, _close)
atexit.register(self.close)
HARDWARE.set_display_power(True)
HARDWARE.set_screen_brightness(65) HARDWARE.set_display_power(True)
HARDWARE.set_screen_brightness(65)
self._set_log_callback()
rl.set_trace_log_level(rl.TraceLogLevel.LOG_WARNING) self._set_log_callback()
rl.set_trace_log_level(rl.TraceLogLevel.LOG_WARNING)
flags = rl.ConfigFlags.FLAG_MSAA_4X_HINT
if ENABLE_VSYNC: flags = rl.ConfigFlags.FLAG_MSAA_4X_HINT
flags |= rl.ConfigFlags.FLAG_VSYNC_HINT if ENABLE_VSYNC:
rl.set_config_flags(flags) flags |= rl.ConfigFlags.FLAG_VSYNC_HINT
rl.set_config_flags(flags)
rl.init_window(self._scaled_width, self._scaled_height, title)
if self._scale != 1.0: rl.init_window(self._scaled_width, self._scaled_height, title)
rl.set_mouse_scale(1 / self._scale, 1 / self._scale) if self._scale != 1.0:
self._render_texture = rl.load_render_texture(self._width, self._height) rl.set_mouse_scale(1 / self._scale, 1 / self._scale)
rl.set_texture_filter(self._render_texture.texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR) self._render_texture = rl.load_render_texture(self._width, self._height)
rl.set_target_fps(fps) rl.set_texture_filter(self._render_texture.texture, rl.TextureFilter.TEXTURE_FILTER_BILINEAR)
rl.set_target_fps(fps)
self._target_fps = fps
self._set_styles() self._target_fps = fps
self._load_fonts() self._set_styles()
self._patch_text_functions() self._load_fonts()
self._patch_text_functions()
if not PC:
self._mouse.start()
@contextmanager
def _startup_profile_context(self):
if "PROFILE_STARTUP" not in os.environ:
yield
return
if not PC: import cProfile
self._mouse.start() import io
import pstats
profiler = cProfile.Profile()
start_time = time.monotonic()
profiler.enable()
# do the init
yield
profiler.disable()
elapsed_ms = (time.monotonic() - start_time) * 1e3
stats_stream = io.StringIO()
pstats.Stats(profiler, stream=stats_stream).sort_stats("cumtime").print_stats(25)
print("\n=== Startup profile ===")
print(stats_stream.getvalue().rstrip())
green = "\033[92m"
reset = "\033[0m"
print(f"{green}UI window ready in {elapsed_ms:.1f} ms{reset}")
sys.exit(0)
def set_modal_overlay(self, overlay, callback: Callable | None = None): def set_modal_overlay(self, overlay, callback: Callable | None = None):
if self._modal_overlay.overlay is not None: if self._modal_overlay.overlay is not None:

Loading…
Cancel
Save