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