panel method
Renders just the debug panel (cached for performance).
Implementation
String panel({int? terminalWidthOverride}) {
final m = metrics;
final currentFrame = m?.frameCount ?? 0;
// Use cached panel if metrics haven't changed
if (_cachedPanel != null &&
_cachedMetricsFrame == currentFrame &&
_cachedPanelWidth == panelWidth) {
return _cachedPanel!;
}
final label = Style().foreground(Colors.yellow).bold();
final avgFps = m?.averageFps ?? 0.0;
final avgFrameTimeUs = m?.averageFrameTime.inMicroseconds ?? 0;
final avgRenderTimeUs = m?.averageRenderDuration.inMicroseconds ?? 0;
final frameCount = m?.frameCount ?? 0;
final skippedFrames = m?.skippedFrames ?? 0;
final renderPct = m?.renderTimePercentage ?? 0.0;
final content =
'${label.render('FPS:')} ${avgFps.toStringAsFixed(1)} (${m?.minFps.toStringAsFixed(0) ?? 0}-${m?.maxFps.toStringAsFixed(0) ?? 0})\n'
'${label.render('Frame Time:')} ${(avgFrameTimeUs / 1000).toStringAsFixed(2)}ms\n'
'${label.render('Render Time:')} $avgRenderTimeUsµs (${renderPct.toStringAsFixed(1)}%)\n'
'${label.render('Frames:')} $frameCount (skipped: $skippedFrames)\n'
'${label.render('Cells:')} ${terminalWidth * terminalHeight}\n'
'${label.render('Renderer:')} $rendererLabel';
final rendered = PanelComponent(
title: title,
content: content,
width: panelWidth,
renderConfig: RenderConfig(
terminalWidth: terminalWidthOverride ?? terminalWidth,
),
).render();
// Cache the result
_cachedPanel = rendered;
_cachedMetricsFrame = currentFrame;
_cachedPanelWidth = panelWidth;
final lines = rendered.split('\n');
_cachedPanelHeight = lines.length;
return rendered;
}