frame method
Drives a single frame. Call from a Ticker
/ SchedulerBinding
.
Implementation
Future<void> frame() async {
// Bail during resize/context swap
// Reentrancy guard
if (!_isRendering || _isResizing || _inFrame) return;
// Guard readiness up front
if (_program == null || _camera == null) return;
_inFrame = true;
try {
_perf?.beginFrame();
// Only sort when needed (camera changed)
if (_needDepthSort && _splatBuffer != null && _splatCount > 0) {
final vp = _projectionMatrix.multiplied(_viewMatrix);
_depthSorter.throttledSort(vp, _splatBuffer!, _splatCount);
}
_perf?.markGpuBegin(_gl);
_draw();
_perf?.markGpuEnd(_gl);
if (_perf != null) {
final perfStats = _perf!.endFrame(_gl);
_fps = perfStats.fps;
_cpuFrameTimeMs = perfStats.cpuMsAvg;
_gpuFrameTimeMs = perfStats.gpuMsAvg;
}
_lastFrameTime = DateTime.timestamp();
} catch (_) {
// Recovery path on GL/Program invalidation
await _recoverFromContextLoss();
} finally {
_inFrame = false;
}
}