1. tuned arrow mesh drawing
2. centralixzed arrow config in layout.py 3. seperate mesh render and display resolution to speed up (~40 fps)
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
"""Shared stage timing helpers for finger example pipelines."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import time
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
class StageProfiler:
|
||||
"""Accumulate per-stage wall times and print rolling averages."""
|
||||
|
||||
DEFAULT_ORDER = (
|
||||
"capture",
|
||||
"uv_unroll",
|
||||
"flow",
|
||||
"hhd",
|
||||
"contact",
|
||||
"read_info",
|
||||
"pipeline",
|
||||
"mesh",
|
||||
"arrows",
|
||||
"charts",
|
||||
"display",
|
||||
"total",
|
||||
)
|
||||
|
||||
def __init__(self, *, report_every: int = 30, stage_order: tuple[str, ...] | None = None):
|
||||
self.report_every = max(1, int(report_every))
|
||||
self.stage_order = stage_order or self.DEFAULT_ORDER
|
||||
self.frame_count = 0
|
||||
self.totals: dict[str, float] = defaultdict(float)
|
||||
self.last: dict[str, float] = {}
|
||||
|
||||
def record(self, name: str, ms: float) -> None:
|
||||
self.totals[name] += ms
|
||||
self.last[name] = ms
|
||||
|
||||
def tick(self) -> None:
|
||||
self.frame_count += 1
|
||||
if self.frame_count % self.report_every == 0:
|
||||
self.print_report(prefix=f"[profile {self.frame_count} frames]")
|
||||
|
||||
def print_report(self, *, prefix: str = "[profile summary]") -> None:
|
||||
if self.frame_count == 0:
|
||||
return
|
||||
n = self.frame_count
|
||||
parts = []
|
||||
for name in self.stage_order:
|
||||
if name in self.totals:
|
||||
parts.append(f"{name}={self.totals[name] / n:.2f}ms")
|
||||
total_ms = self.totals.get("total", 0.0) / n
|
||||
if total_ms > 0:
|
||||
parts.append(f"fps={1000.0 / total_ms:.1f}")
|
||||
print(f"\n{prefix} " + " | ".join(parts))
|
||||
|
||||
|
||||
def run_deformation_timed(tactile, *, check_motion=True, threshold=0, tail_frames=10):
|
||||
"""Run flow + gated HHD; return (flow_ms, hhd_ms). Mirrors Sensor.compute_deformation."""
|
||||
sensor = tactile.raw_sensor
|
||||
|
||||
t0 = time.perf_counter()
|
||||
sensor.compute_flow()
|
||||
flow_ms = (time.perf_counter() - t0) * 1000.0
|
||||
|
||||
run_hhd = True
|
||||
if check_motion:
|
||||
is_motion = sensor.detect_motion(threshold=threshold)
|
||||
try:
|
||||
tail_frames = max(0, int(tail_frames))
|
||||
except (TypeError, ValueError):
|
||||
tail_frames = 0
|
||||
|
||||
if is_motion:
|
||||
sensor.tail_frames_count = 0
|
||||
elif sensor.tail_frames_count < tail_frames:
|
||||
sensor.tail_frames_count += 1
|
||||
else:
|
||||
run_hhd = False
|
||||
sensor.tail_frames_count = tail_frames
|
||||
|
||||
hhd_ms = 0.0
|
||||
if run_hhd:
|
||||
t1 = time.perf_counter()
|
||||
sensor.compute_hhd()
|
||||
hhd_ms = (time.perf_counter() - t1) * 1000.0
|
||||
|
||||
return flow_ms, hhd_ms
|
||||
Reference in New Issue
Block a user