Skip to content

Commit 675c351

Browse files
committed
Start animator paused (flutter#29007)
Do not call Animator::Delegate::OnAnimatorNotifyIdle until at least one frame has been rendered. (flutter#29015)
1 parent 253f6ca commit 675c351

3 files changed

Lines changed: 17 additions & 18 deletions

File tree

shell/common/animator.cc

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ Animator::Animator(Delegate& delegate,
2727
: delegate_(delegate),
2828
task_runners_(std::move(task_runners)),
2929
waiter_(std::move(waiter)),
30-
dart_frame_deadline_(0),
3130
#if SHELL_ENABLE_METAL
3231
layer_tree_pipeline_(std::make_shared<LayerTreePipeline>(2)),
3332
#else // SHELL_ENABLE_METAL
@@ -41,11 +40,6 @@ Animator::Animator(Delegate& delegate,
4140
: 2)),
4241
#endif // SHELL_ENABLE_METAL
4342
pending_frame_semaphore_(1),
44-
paused_(false),
45-
regenerate_layer_tree_(false),
46-
frame_scheduled_(false),
47-
notify_idle_task_id_(0),
48-
dimension_change_pending_(false),
4943
weak_factory_(this) {
5044
}
5145

@@ -92,10 +86,10 @@ const char* Animator::FrameParity() {
9286
return (frame_number % 2) ? "even" : "odd";
9387
}
9488

95-
static int64_t FxlToDartOrEarlier(fml::TimePoint time) {
96-
int64_t dart_now = Dart_TimelineGetMicros();
89+
static fml::TimePoint FxlToDartOrEarlier(fml::TimePoint time) {
90+
auto dart_now = fml::TimeDelta::FromMicroseconds(Dart_TimelineGetMicros());
9791
fml::TimePoint fxl_now = fml::TimePoint::Now();
98-
return (time - fxl_now).ToMicroseconds() + dart_now;
92+
return fml::TimePoint::FromEpochDelta(time - fxl_now + dart_now);
9993
}
10094

10195
void Animator::BeginFrame(
@@ -153,7 +147,7 @@ void Animator::BeginFrame(
153147
delegate_.OnAnimatorBeginFrame(frame_target_time, frame_number);
154148
}
155149

156-
if (!frame_scheduled_) {
150+
if (!frame_scheduled_ && has_rendered_) {
157151
// Under certain workloads (such as our parent view resizing us, which is
158152
// communicated to us by repeat viewport metrics events), we won't
159153
// actually have a frame scheduled yet, despite the fact that we *will* be
@@ -183,6 +177,7 @@ void Animator::BeginFrame(
183177
}
184178

185179
void Animator::Render(std::unique_ptr<flutter::LayerTree> layer_tree) {
180+
has_rendered_ = true;
186181
if (dimension_change_pending_ &&
187182
layer_tree->frame_size() != last_layer_tree_size_) {
188183
dimension_change_pending_ = false;
@@ -275,7 +270,10 @@ void Animator::AwaitVSync() {
275270
}
276271
});
277272

278-
delegate_.OnAnimatorNotifyIdle(dart_frame_deadline_);
273+
if (has_rendered_) {
274+
delegate_.OnAnimatorNotifyIdle(
275+
dart_frame_deadline_.ToEpochDelta().ToMicroseconds());
276+
}
279277
}
280278

281279
void Animator::ScheduleSecondaryVsyncCallback(uintptr_t id,

shell/common/animator.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,18 @@ class Animator final {
106106

107107
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder_;
108108
uint64_t frame_request_number_ = 1;
109-
int64_t dart_frame_deadline_;
109+
fml::TimePoint dart_frame_deadline_;
110110
std::shared_ptr<LayerTreePipeline> layer_tree_pipeline_;
111111
fml::Semaphore pending_frame_semaphore_;
112112
LayerTreePipeline::ProducerContinuation producer_continuation_;
113-
bool paused_;
114-
bool regenerate_layer_tree_;
115-
bool frame_scheduled_;
116-
int notify_idle_task_id_;
117-
bool dimension_change_pending_;
113+
bool paused_ = true;
114+
bool regenerate_layer_tree_ = false;
115+
bool frame_scheduled_ = false;
116+
int notify_idle_task_id_ = 0;
117+
bool dimension_change_pending_ = false;
118118
SkISize last_layer_tree_size_ = {0, 0};
119119
std::deque<uint64_t> trace_flow_ids_;
120+
bool has_rendered_ = false;
120121

121122
fml::WeakPtrFactory<Animator> weak_factory_;
122123

shell/common/engine.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,6 @@ tonic::DartErrorHandleType Engine::GetUIIsolateLastError() {
263263

264264
void Engine::OnOutputSurfaceCreated() {
265265
have_surface_ = true;
266-
StartAnimatorIfPossible();
267266
ScheduleFrame();
268267
}
269268

@@ -463,6 +462,7 @@ std::string Engine::DefaultRouteName() {
463462
}
464463

465464
void Engine::ScheduleFrame(bool regenerate_layer_tree) {
465+
StartAnimatorIfPossible();
466466
animator_->RequestFrame(regenerate_layer_tree);
467467
}
468468

0 commit comments

Comments
 (0)