recordFrame method

bool recordFrame(
  1. Duration renderDuration
)

Records one completed render and returns whether the level changed.

Implementation

bool recordFrame(Duration renderDuration) {
  _lastRenderDuration = renderDuration;

  final frameBudgetUs = _frameBudget.inMicroseconds;
  final renderDurationUs = renderDuration.inMicroseconds;
  final current = _level;

  if (!enabled) {
    _recordBudgetDecision(
      current: current,
      next: current,
      decisionResult: 'disabled',
      renderDurationUs: renderDurationUs,
      frameBudgetUs: frameBudgetUs,
    );
    return false;
  }

  if (renderDuration > _frameBudget) {
    _overBudgetStreak++;
    _recoveryStreak = 0;
    if (_overBudgetStreak < options.overBudgetFrames) {
      _recordBudgetDecision(
        current: current,
        next: current,
        decisionResult: 'hold',
        renderDurationUs: renderDurationUs,
        frameBudgetUs: frameBudgetUs,
        overBudget: true,
      );
      return false;
    }
    _overBudgetStreak = 0;
    final next = _nextLevel(_level, options.maxLevel);
    if (next == _level) {
      _recordBudgetDecision(
        current: current,
        next: current,
        decisionResult: 'hold',
        renderDurationUs: renderDurationUs,
        frameBudgetUs: frameBudgetUs,
        overBudget: true,
      );
      return false;
    }
    _level = next;
    _recordBudgetDecision(
      current: current,
      next: next,
      decisionResult: 'degrade',
      renderDurationUs: renderDurationUs,
      frameBudgetUs: frameBudgetUs,
      overBudget: true,
    );
    return true;
  }

  _recoveryStreak++;
  _overBudgetStreak = 0;
  if (_recoveryStreak < options.recoveryFrames) {
    _recordBudgetDecision(
      current: current,
      next: current,
      decisionResult: 'hold',
      renderDurationUs: renderDurationUs,
      frameBudgetUs: frameBudgetUs,
    );
    return false;
  }
  _recoveryStreak = 0;
  final next = _previousLevel(_level);
  if (next == _level) {
    _recordBudgetDecision(
      current: current,
      next: current,
      decisionResult: 'hold',
      renderDurationUs: renderDurationUs,
      frameBudgetUs: frameBudgetUs,
    );
    return false;
  }
  _level = next;
  _recordBudgetDecision(
    current: current,
    next: next,
    decisionResult: 'recover',
    renderDurationUs: renderDurationUs,
    frameBudgetUs: frameBudgetUs,
  );
  return true;
}