frame method

Future<void> frame()

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;
  }
}