remove perf dashboard not useful needs to be relevant to gui2 profiling.
This commit is contained in:
@@ -1,9 +0,0 @@
|
|||||||
# Performance Dashboard
|
|
||||||
|
|
||||||
**Track ID:** performance_dashboard_20260306
|
|
||||||
|
|
||||||
**Status:** Planned
|
|
||||||
|
|
||||||
**See Also:**
|
|
||||||
- [Spec](./spec.md)
|
|
||||||
- [Plan](./plan.md)
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "performance_dashboard_20260306",
|
|
||||||
"name": "Performance Dashboard",
|
|
||||||
"status": "planned",
|
|
||||||
"created_at": "2026-03-06T00:00:00Z",
|
|
||||||
"updated_at": "2026-03-06T00:00:00Z",
|
|
||||||
"type": "feature",
|
|
||||||
"priority": "medium"
|
|
||||||
}
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
# Implementation Plan: Performance Dashboard (performance_dashboard_20260306)
|
|
||||||
|
|
||||||
> **Reference:** [Spec](./spec.md) | [Architecture Guide](../../../docs/guide_architecture.md)
|
|
||||||
|
|
||||||
## Phase 1: Historical Data Storage
|
|
||||||
Focus: Add history buffer to PerformanceMonitor
|
|
||||||
|
|
||||||
- [ ] Task 1.1: Initialize MMA Environment
|
|
||||||
- [ ] Task 1.2: Add history deque to PerformanceMonitor
|
|
||||||
- WHERE: `src/performance_monitor.py` `PerformanceMonitor.__init__`
|
|
||||||
- WHAT: Rolling window of metrics
|
|
||||||
- HOW:
|
|
||||||
```python
|
|
||||||
from collections import deque
|
|
||||||
self._history: deque = deque(maxlen=100)
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] Task 1.3: Store metrics each frame
|
|
||||||
- WHERE: `src/performance_monitor.py` `end_frame()`
|
|
||||||
- WHAT: Append current metrics to history
|
|
||||||
- HOW:
|
|
||||||
```python
|
|
||||||
def end_frame(self) -> None:
|
|
||||||
# ... existing code ...
|
|
||||||
self._history.append({
|
|
||||||
"fps": self._fps, "frame_time_ms": self._frame_time_ms,
|
|
||||||
"cpu_percent": self._cpu_percent, "input_lag_ms": self._input_lag_ms
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] Task 1.4: Add get_history method
|
|
||||||
- WHERE: `src/performance_monitor.py`
|
|
||||||
- HOW:
|
|
||||||
```python
|
|
||||||
def get_history(self) -> list[dict]:
|
|
||||||
return list(self._history)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Phase 2: CPU Graph
|
|
||||||
Focus: Render CPU usage over time
|
|
||||||
|
|
||||||
- [ ] Task 2.1: Extract CPU values from history
|
|
||||||
- WHERE: `src/gui_2.py` diagnostics panel
|
|
||||||
- WHAT: Get CPU% array for plotting
|
|
||||||
- HOW:
|
|
||||||
```python
|
|
||||||
history = self.perf_monitor.get_history()
|
|
||||||
cpu_values = [h["cpu_percent"] for h in history]
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] Task 2.2: Render line graph
|
|
||||||
- WHERE: `src/gui_2.py`
|
|
||||||
- WHAT: imgui.plot_lines for CPU
|
|
||||||
- HOW:
|
|
||||||
```python
|
|
||||||
if imgui.collapsing_header("CPU Usage"):
|
|
||||||
imgui.plot_lines("##cpu", cpu_values, scale_min=0, scale_max=100)
|
|
||||||
imgui.text(f"Current: {cpu_values[-1]:.1f}%" if cpu_values else "N/A")
|
|
||||||
```
|
|
||||||
|
|
||||||
## Phase 3: Frame Time Histogram
|
|
||||||
Focus: Show frame time distribution
|
|
||||||
|
|
||||||
- [ ] Task 3.1: Bucket frame times
|
|
||||||
- WHERE: `src/gui_2.py`
|
|
||||||
- WHAT: Categorize into 0-16ms, 16-33ms, 33+ms
|
|
||||||
- HOW:
|
|
||||||
```python
|
|
||||||
buckets = [0, 0, 0] # <16ms, 16-33ms, 33+ms
|
|
||||||
for h in history:
|
|
||||||
ft = h["frame_time_ms"]
|
|
||||||
if ft < 16: buckets[0] += 1
|
|
||||||
elif ft < 33: buckets[1] += 1
|
|
||||||
else: buckets[2] += 1
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] Task 3.2: Render histogram
|
|
||||||
- WHERE: `src/gui_2.py`
|
|
||||||
- HOW:
|
|
||||||
```python
|
|
||||||
imgui.plot_histogram("##frametime", buckets)
|
|
||||||
imgui.text("<16ms: {} 16-33ms: {} >33ms: {}".format(*buckets))
|
|
||||||
```
|
|
||||||
|
|
||||||
## Phase 4: Testing
|
|
||||||
- [ ] Task 4.1: Write unit tests
|
|
||||||
- [ ] Task 4.2: Conductor - Phase Verification
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
# Track Specification: Performance Dashboard (performance_dashboard_20260306)
|
|
||||||
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
Expand performance metrics panel with CPU/RAM graphs, frame time histogram. Uses existing `performance_monitor.py`.
|
|
||||||
|
|
||||||
## Current State Audit
|
|
||||||
|
|
||||||
### Already Implemented (DO NOT re-implement)
|
|
||||||
|
|
||||||
#### PerformanceMonitor (src/performance_monitor.py)
|
|
||||||
- **`PerformanceMonitor` class**: Tracks FPS, frame time, CPU, input lag
|
|
||||||
- **`start_frame()`**: Called at frame start
|
|
||||||
- **`end_frame()`**: Called at frame end
|
|
||||||
- **`record_input_event()`**: Track input latency
|
|
||||||
- **`get_metrics()`**: Returns dict with:
|
|
||||||
```python
|
|
||||||
{
|
|
||||||
"fps": float,
|
|
||||||
"frame_time_ms": float
|
|
||||||
"cpu_percent": float
|
|
||||||
"input_lag_ms": float
|
|
||||||
}
|
|
||||||
```
|
|
||||||
- **No historical storage** - metrics are per-frame only
|
|
||||||
|
|
||||||
### Gaps to Fill (This Track's Scope)
|
|
||||||
- No historical graphs of CPU/RAM over time
|
|
||||||
- No rolling window storage
|
|
||||||
- No frame time histogram
|
|
||||||
|
|
||||||
## Architectural Constraints
|
|
||||||
|
|
||||||
### 60fps During Graphs
|
|
||||||
- Graph rendering MUST NOT impact frame rate
|
|
||||||
- Use simple line rendering (imgui.plot_lines)
|
|
||||||
|
|
||||||
### Memory Bounds
|
|
||||||
- Rolling window: max 100 data points (deque)
|
|
||||||
- Memory per point: ~16 bytes (4 floats)
|
|
||||||
|
|
||||||
## Architecture Reference
|
|
||||||
|
|
||||||
### Key Integration Points
|
|
||||||
|
|
||||||
| File | Lines | Purpose |
|
|
||||||
|------|-------|---------|
|
|
||||||
| `src/performance_monitor.py` | 10-80 | `PerformanceMonitor` class |
|
|
||||||
| `src/gui_2.py` | ~2800-2900 | Diagnostics panel - add graphs |
|
|
||||||
|
|
||||||
### Proposed Enhancement
|
|
||||||
```python
|
|
||||||
# In PerformanceMonitor:
|
|
||||||
from collections import deque
|
|
||||||
|
|
||||||
class PerformanceMonitor:
|
|
||||||
def __init__(self):
|
|
||||||
self._history: deque = deque(maxlen=100)
|
|
||||||
|
|
||||||
def get_history(self) -> list[dict]:
|
|
||||||
return list(self._history)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Functional Requirements
|
|
||||||
|
|
||||||
### FR1: Historical Data Storage
|
|
||||||
- Add `_history: deque` to PerformanceMonitor (maxlen=100)
|
|
||||||
- Store metrics each frame
|
|
||||||
- `get_history()` returns historical data
|
|
||||||
|
|
||||||
### FR2: CPU Graph
|
|
||||||
- Line graph showing CPU% over last 100 frames
|
|
||||||
- X-axis: frame index
|
|
||||||
- Y-axis: CPU %
|
|
||||||
- Use imgui.plot_lines()
|
|
||||||
|
|
||||||
### FR3: RAM Graph
|
|
||||||
- Line graph showing RAM usage
|
|
||||||
- X-axis: frame index
|
|
||||||
- Y-axis: MB
|
|
||||||
- Use imgui.plot_lines()
|
|
||||||
|
|
||||||
### FR4: Frame Time Histogram
|
|
||||||
- Bar chart showing frame time distribution
|
|
||||||
- Buckets: 0-16ms, 16-33ms, 33+ms
|
|
||||||
- Use imgui.plot_histogram()
|
|
||||||
|
|
||||||
## Non-Functional Requirements
|
|
||||||
| Requirement | Constraint |
|
|
||||||
|-------------|------------|
|
|
||||||
| Frame Time Impact | <1ms for graph render |
|
|
||||||
| Memory | 100 data points max |
|
|
||||||
|
|
||||||
## Testing Requirements
|
|
||||||
### Unit Tests
|
|
||||||
- Test history storage limits
|
|
||||||
- Test graph rendering doesn't crash
|
|
||||||
### Integration Tests
|
|
||||||
- Verify graphs display in GUI
|
|
||||||
- Verify 60fps maintained with graphs
|
|
||||||
|
|
||||||
## Acceptance Criteria
|
|
||||||
- [ ] CPU graph shows rolling history
|
|
||||||
- [ ] RAM graph shows rolling history
|
|
||||||
- [ ] Frame time histogram displays
|
|
||||||
- [ ] History limited to 100 points
|
|
||||||
- [ ] Uses existing `PerformanceMonitor.get_metrics()`
|
|
||||||
- [ ] 1-space indentation maintained
|
|
||||||
Reference in New Issue
Block a user