(metrics: PerformanceMetrics)
| 444 | } |
| 445 | |
| 446 | function updateMetricsDisplay(metrics: PerformanceMetrics): void { |
| 447 | // FPS Display with color coding |
| 448 | const fps = metrics.fps; |
| 449 | const fpsEl = document.getElementById('fpsDisplay'); |
| 450 | if (fpsEl) { |
| 451 | fpsEl.textContent = fps.toFixed(1); |
| 452 | |
| 453 | // Update quality indicator |
| 454 | if (fps > FPS_SMOOTH_THRESHOLD) { |
| 455 | fpsEl.setAttribute('data-quality', 'smooth'); |
| 456 | } else if (fps > FPS_MEDIUM_THRESHOLD) { |
| 457 | fpsEl.setAttribute('data-quality', 'medium'); |
| 458 | } else { |
| 459 | fpsEl.setAttribute('data-quality', 'choppy'); |
| 460 | } |
| 461 | } |
| 462 | |
| 463 | // Frame Time Stats |
| 464 | const ft = metrics.frameTimeStats; |
| 465 | setElementText( |
| 466 | 'frameTimeDisplay', |
| 467 | `${ft.min.toFixed(1)} / ${ft.avg.toFixed(1)} / ${ft.max.toFixed(1)} / ${ft.p95.toFixed(1)} / ${ft.p99.toFixed(1)} ms` |
| 468 | ); |
| 469 | |
| 470 | // Memory Stats |
| 471 | if (metrics.memory.used > 0) { |
| 472 | setElementText( |
| 473 | 'memoryDisplay', |
| 474 | `${formatBytes(metrics.memory.used)} / ${formatBytes(metrics.memory.peak)}` |
| 475 | ); |
| 476 | } else { |
| 477 | setElementText('memoryDisplay', 'N/A'); |
| 478 | } |
| 479 | |
| 480 | // Frame Drops |
| 481 | setElementText( |
| 482 | 'frameDropsDisplay', |
| 483 | `${metrics.frameDrops.totalDrops} / ${metrics.frameDrops.consecutiveDrops}` |
| 484 | ); |
| 485 | |
| 486 | // Total Frames |
| 487 | setElementText('totalFramesDisplay', formatNumber(metrics.totalFrames)); |
| 488 | |
| 489 | // Elapsed Time |
| 490 | setElementText('elapsedDisplay', formatDuration(metrics.elapsedTime)); |
| 491 | |
| 492 | // Update frame time graph |
| 493 | if (frameGraph) { |
| 494 | frameGraph.addFrame(ft.avg); |
| 495 | } |
| 496 | } |
| 497 | |
| 498 | function clearMetricsDisplay(): void { |
| 499 | setElementText('fpsDisplay', '--'); |
no test coverage detected