Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 22377e7

Browse files
author
Chris Yang
committed
refresh frame rate reporting
1 parent 0236853 commit 22377e7

File tree

8 files changed

+46
-8
lines changed

8 files changed

+46
-8
lines changed

shell/common/animator.cc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,10 @@ void Animator::BeginFrame(
133133
// We have acquired a valid continuation from the pipeline and are ready
134134
// to service potential frame.
135135
FML_DCHECK(producer_continuation_);
136+
const fml::TimePoint vsync_start_time =
137+
frame_timings_recorder_->GetVsyncStartTime();
136138
fml::tracing::TraceEventAsyncComplete(
137-
"flutter", "VsyncSchedulingOverhead",
138-
frame_timings_recorder_->GetVsyncStartTime(),
139+
"flutter", "VsyncSchedulingOverhead", vsync_start_time,
139140
frame_timings_recorder_->GetBuildStartTime());
140141
const fml::TimePoint frame_target_time =
141142
frame_timings_recorder_->GetVsyncTargetTime();
@@ -144,7 +145,8 @@ void Animator::BeginFrame(
144145
TRACE_EVENT2("flutter", "Framework Workload", "mode", "basic", "frame",
145146
FrameParity());
146147
uint64_t frame_number = frame_timings_recorder_->GetFrameNumber();
147-
delegate_.OnAnimatorBeginFrame(frame_target_time, frame_number);
148+
delegate_.OnAnimatorBeginFrame(vsync_start_time, frame_target_time,
149+
frame_number);
148150
}
149151

150152
if (!frame_scheduled_ && has_rendered_) {

shell/common/animator.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ class Animator final {
3131
public:
3232
class Delegate {
3333
public:
34-
virtual void OnAnimatorBeginFrame(fml::TimePoint frame_target_time,
34+
virtual void OnAnimatorBeginFrame(fml::TimePoint vsync_start_time,
35+
fml::TimePoint frame_target_time,
3536
uint64_t frame_number) = 0;
3637

3738
virtual void OnAnimatorNotifyIdle(int64_t deadline) = 0;

shell/common/animator_unittests.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ namespace testing {
2020

2121
class FakeAnimatorDelegate : public Animator::Delegate {
2222
public:
23-
void OnAnimatorBeginFrame(fml::TimePoint frame_target_time,
23+
void OnAnimatorBeginFrame(fml::TimePoint vsync_start_time,
24+
fml::TimePoint frame_target_time,
2425
uint64_t frame_number) override {}
2526

2627
void OnAnimatorNotifyIdle(int64_t deadline) override {

shell/common/display_manager.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ void DisplayManager::HandleDisplayUpdates(
3232
FML_CHECK(displays_.empty());
3333
displays_ = std::move(displays);
3434
return;
35+
case DisplayUpdateType::kNewFrame:
36+
displays_.insert(displays_.end(),
37+
std::make_move_iterator(displays.begin()),
38+
std::make_move_iterator(displays.end()));
39+
FML_DLOG(ERROR) << "display updated "
40+
<< displays_.back()->GetRefreshRate();
41+
break;
3542
default:
3643
FML_CHECK(false) << "Unknown DisplayUpdateType.";
3744
}

shell/common/display_manager.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ enum class DisplayUpdateType {
2020
/// 1. The frame buffer hardware is connected.
2121
/// 2. The display is drawable, e.g. it isn't being mirrored from another
2222
/// connected display or sleeping.
23-
kStartup
23+
kStartup,
24+
25+
/// The `flutter::Display` that were active and a new frame requests an
26+
/// update.
27+
kNewFrame,
2428
};
2529

2630
/// Manages lifecycle of the connected displays. This class is thread-safe.

shell/common/shell.cc

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1059,11 +1059,27 @@ void Shell::OnPlatformViewSetNextFrameCallback(const fml::closure& closure) {
10591059
}
10601060

10611061
// |Animator::Delegate|
1062-
void Shell::OnAnimatorBeginFrame(fml::TimePoint frame_target_time,
1062+
void Shell::OnAnimatorBeginFrame(fml::TimePoint vsync_start_time,
1063+
fml::TimePoint frame_target_time,
10631064
uint64_t frame_number) {
10641065
FML_DCHECK(is_setup_);
10651066
FML_DCHECK(task_runners_.GetUITaskRunner()->RunsTasksOnCurrentThread());
10661067

1068+
auto is_frame_rate_same = [](double fr1, double fr2) {
1069+
const double kRefreshRateCompareEpsilon = 1;
1070+
return fabs(fr1 - fr2) < kRefreshRateCompareEpsilon;
1071+
};
1072+
1073+
double new_frame_rate =
1074+
round((1 / (frame_target_time - vsync_start_time).ToSecondsF()));
1075+
if (!is_frame_rate_same(frame_rate_, new_frame_rate)) {
1076+
frame_rate_ = new_frame_rate;
1077+
std::vector<std::unique_ptr<flutter::Display>> displays;
1078+
displays.push_back(std::make_unique<flutter::Display>(frame_rate_));
1079+
OnDisplayUpdates(flutter::DisplayUpdateType::kNewFrame,
1080+
std::move(displays));
1081+
}
1082+
10671083
// record the target time for use by rasterizer.
10681084
{
10691085
std::scoped_lock time_recorder_lock(time_recorder_mutex_);

shell/common/shell.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,8 @@ class Shell final : public PlatformView::Delegate,
565565
AssetResolver::AssetResolverType type) override;
566566

567567
// |Animator::Delegate|
568-
void OnAnimatorBeginFrame(fml::TimePoint frame_target_time,
568+
void OnAnimatorBeginFrame(fml::TimePoint vsync_start_time,
569+
fml::TimePoint frame_target_time,
569570
uint64_t frame_number) override;
570571

571572
// |Animator::Delegate|
@@ -690,6 +691,11 @@ class Shell final : public PlatformView::Delegate,
690691
fml::WeakPtrFactory<Shell> weak_factory_;
691692
friend class testing::ShellTest;
692693

694+
// Indicates the current frame_rate_.
695+
//
696+
// Every new frame may update this value if necessary.
697+
double frame_rate_ = -1;
698+
693699
FML_DISALLOW_COPY_AND_ASSIGN(Shell);
694700
};
695701

shell/common/vsync_waiter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class VsyncWaiter : public std::enable_shared_from_this<VsyncWaiter> {
7575
std::mutex callback_mutex_;
7676
Callback callback_;
7777
std::unordered_map<uintptr_t, fml::closure> secondary_callbacks_;
78+
double frame_rate_ = -1;
7879

7980
void PauseDartMicroTasks();
8081
static void ResumeDartMicroTasks(fml::TaskQueueId ui_task_queue_id);

0 commit comments

Comments
 (0)