${translateText("performance_overlay.fps")}
${this.currentFPS}
${translateText("performance_overlay.avg_60s")}
${this.averageFPS}
${translateText("performance_overlay.frame")}
${this.frameTime}ms
${translateText("performance_overlay.tps")}
${this.currentTPS}
(${translateText("performance_overlay.tps_avg_60s")}
${this.averageTPS})
${translateText("performance_overlay.tick_exec")}
${this.tickExecutionAvg.toFixed(2)}ms
(max: ${this.tickExecutionMax}ms)
${translateText("performance_overlay.tick_delay")}
${this.tickDelayAvg.toFixed(2)}ms
(max: ${this.tickDelayMax}ms)
${this.layerBreakdown.length
? html`
${translateText("performance_overlay.render_layers_summary", {
frames: this.renderLastTickFrameCount,
ms: this.renderLastTickLayerTotalMs.toFixed(2),
})}
${this.renderLayersExpanded
? html`
${renderLayersToShow.map((layer) => {
const width = Math.min(
100,
(layer.avg / maxLayerAvg) * 100 || 0,
);
const perTickRenderMs =
this.renderLastTickLayerDurations[layer.name] ?? 0;
const perTickRenderAvgMs =
this.renderPerTickLayerStats.get(layer.name)?.avg ??
0;
const isInactive = perTickRenderMs <= 0.01;
const title = `${layer.name} | last tick render: ${perTickRenderMs.toFixed(
2,
)}ms`;
return html`
${layer.name}
${layer.avg.toFixed(2)} / ${layer.max.toFixed(2)}ms
| ${perTickRenderAvgMs.toFixed(2)}ms
`;
})}`
: html``}
`
: html``}
${this.tickLayerBreakdown.length
? html`
${translateText("performance_overlay.tick_layers_summary", {
count: this.tickLayerLastCount,
ms: this.tickLayerLastTotalMs.toFixed(2),
})}
${this.tickLayersExpanded
? html`
${tickLayersToShow.map((layer) => {
const width = Math.min(
100,
(layer.avg / maxTickLayerAvg) * 100 || 0,
);
const lastTickMs =
this.tickLayerLastDurations[layer.name] ?? 0;
const isInactive = lastTickMs <= 0.01;
const title = `${layer.name} | last tick: ${lastTickMs.toFixed(2)}ms`;
return html`
${layer.name}
${layer.avg.toFixed(2)} / ${layer.max.toFixed(2)}ms
`;
})}`
: html``}
`
: html``}
${unitLayerCounters
? html`
tracked: ${Number(unitLayerCounters.moversTrackedTotal ?? 0)}
sampled: ${Number(unitLayerCounters.moversSampled ?? 0)}
drawn: ${Number(unitLayerCounters.moversDrawn ?? 0)}
skipped: ${Number(unitLayerCounters.moversSkipped ?? 0)}
moverCanvasScale:
${Number(unitLayerCounters.moverCanvasScale ?? 0).toFixed(0)}
rescale(last/avg/count):
${Number(unitLayerCounters.moverCanvasRescaleLastMs ?? 0).toFixed(2)}ms
/
${Number(unitLayerCounters.moverCanvasRescaleAvgMs ?? 0).toFixed(2)}ms
/
${Number(unitLayerCounters.moverCanvasRescaleCount ?? 0).toFixed(0)}
draw:
${Number(unitLayerCounters.drawTimeMs ?? 0).toFixed(2)}ms
on:
${Number(unitLayerCounters.onScreenDrawTimeMs ?? 0).toFixed(2)}ms
/
${Number(unitLayerCounters.onScreenBudgetTargetMs ?? 0).toFixed(1)}ms
off:
${Number(unitLayerCounters.offScreenVerifyTimeMs ?? 0).toFixed(2)}ms
/
${Number(unitLayerCounters.offScreenVerifyBudgetMs ?? 0).toFixed(2)}ms
avgOnDebt: ${Number(unitLayerCounters.avgOnScreenDebt ?? 0).toFixed(2)}
maxOnDebt: ${Number(unitLayerCounters.maxOnScreenDebt ?? 0).toFixed(0)}
`
: html``}