panel method
Renders just the debug panel (cached for performance).
Implementation
String panel({int? terminalWidthOverride}) {
final m = metrics;
final currentFrame = m?.frameCount ?? 0;
final customHash = Object.hashAll(
customMetrics.entries.map((e) => Object.hash(e.key, e.value)),
);
// Use cached panel if metrics haven't changed
if (_cachedPanel != null &&
_cachedMetricsFrame == currentFrame &&
_cachedPanelWidth == panelWidth &&
_cachedCustomMetricsHash == customHash) {
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 = StringBuffer()
..writeln(
'${label.render('FPS:')} ${avgFps.toStringAsFixed(1)} '
'(${m?.minFps.toStringAsFixed(0) ?? 0}-${m?.maxFps.toStringAsFixed(0) ?? 0})',
)
..writeln(
'${label.render('Frame Time:')} ${(avgFrameTimeUs / 1000).toStringAsFixed(2)}ms',
)
..writeln(
'${label.render('Render Time:')} $avgRenderTimeUsµs '
'(${renderPct.toStringAsFixed(1)}%)',
)
..writeln(
'${label.render('Frames:')} $frameCount (skipped: $skippedFrames)',
)
..writeln('${label.render('Cells:')} ${terminalWidth * terminalHeight}')
..writeln('${label.render('Renderer:')} $rendererLabel');
for (final entry in customMetrics.entries) {
content.writeln('${label.render('${entry.key}:')} ${entry.value}');
}
final rendered = PanelComponent(
title: title,
content: content.toString().trimRight(),
width: panelWidth,
renderConfig: RenderConfig(
terminalWidth: terminalWidthOverride ?? terminalWidth,
),
).render();
// Cache the result
_cachedPanel = rendered;
_cachedMetricsFrame = currentFrame;
_cachedPanelWidth = panelWidth;
_cachedCustomMetricsHash = customHash;
final lines = rendered.split('\n');
_cachedPanelHeight = lines.length;
return rendered;
}