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

Commit

Permalink
Reland fix wrong VSYNC event (#37865)
Browse files Browse the repository at this point in the history
  • Loading branch information
fzyzcjy authored Dec 7, 2022
1 parent 5caef85 commit 8f6036e
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 8 deletions.
7 changes: 7 additions & 0 deletions fml/trace_event.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,13 @@
#endif // TRACE_EVENT_HIDE_MACROS
#endif // !defined(OS_FUCHSIA)

#define TRACE_EVENT2_INT(category_group, name, arg1_name, arg1_val, arg2_name, \
arg2_val) \
const auto __arg1_val_str = std::to_string(arg1_val); \
const auto __arg2_val_str = std::to_string(arg2_val); \
TRACE_EVENT2(category_group, name, arg1_name, __arg1_val_str.c_str(), \
arg2_name, __arg2_val_str.c_str());

namespace fml {
namespace tracing {

Expand Down
8 changes: 6 additions & 2 deletions shell/common/vsync_waiter_fallback.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,17 @@ VsyncWaiterFallback::~VsyncWaiterFallback() = default;

// |VsyncWaiter|
void VsyncWaiterFallback::AwaitVSync() {
TRACE_EVENT0("flutter", "VSYNC");

constexpr fml::TimeDelta kSingleFrameInterval =
fml::TimeDelta::FromSecondsF(1.0 / 60.0);
auto frame_start_time =
SnapToNextTick(fml::TimePoint::Now(), phase_, kSingleFrameInterval);
auto frame_target_time = frame_start_time + kSingleFrameInterval;

TRACE_EVENT2_INT("flutter", "PlatformVsync", "frame_start_time",
frame_start_time.ToEpochDelta().ToMicroseconds(),
"frame_target_time",
frame_target_time.ToEpochDelta().ToMicroseconds());

std::weak_ptr<VsyncWaiterFallback> weak_this =
std::static_pointer_cast<VsyncWaiterFallback>(shared_from_this());

Expand Down
15 changes: 11 additions & 4 deletions shell/platform/android/vsync_waiter_android.cc
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,6 @@ void VsyncWaiterAndroid::AwaitVSync() {

// static
void VsyncWaiterAndroid::OnVsyncFromNDK(int64_t frame_nanos, void* data) {
TRACE_EVENT0("flutter", "VSYNC");

auto frame_time = fml::TimePoint::FromEpochDelta(
fml::TimeDelta::FromNanoseconds(frame_nanos));
auto now = fml::TimePoint::Now();
Expand All @@ -62,6 +60,12 @@ void VsyncWaiterAndroid::OnVsyncFromNDK(int64_t frame_nanos, void* data) {
}
auto target_time = frame_time + fml::TimeDelta::FromNanoseconds(
1000000000.0 / g_refresh_rate_);

TRACE_EVENT2_INT("flutter", "PlatformVsync", "frame_start_time",
frame_time.ToEpochDelta().ToMicroseconds(),
"frame_target_time",
target_time.ToEpochDelta().ToMicroseconds());

auto* weak_this = reinterpret_cast<std::weak_ptr<VsyncWaiter>*>(data);
ConsumePendingCallback(weak_this, frame_time, target_time);
}
Expand All @@ -72,13 +76,16 @@ void VsyncWaiterAndroid::OnVsyncFromJava(JNIEnv* env,
jlong frameDelayNanos,
jlong refreshPeriodNanos,
jlong java_baton) {
TRACE_EVENT0("flutter", "VSYNC");

auto frame_time =
fml::TimePoint::Now() - fml::TimeDelta::FromNanoseconds(frameDelayNanos);
auto target_time =
frame_time + fml::TimeDelta::FromNanoseconds(refreshPeriodNanos);

TRACE_EVENT2_INT("flutter", "PlatformVsync", "frame_start_time",
frame_time.ToEpochDelta().ToMicroseconds(),
"frame_target_time",
target_time.ToEpochDelta().ToMicroseconds());

auto* weak_this = reinterpret_cast<std::weak_ptr<VsyncWaiter>*>(java_baton);
ConsumePendingCallback(weak_this, frame_time, target_time);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,14 +102,16 @@ - (void)pause {
}

- (void)onDisplayLink:(CADisplayLink*)link {
TRACE_EVENT0("flutter", "VSYNC");

CFTimeInterval delay = CACurrentMediaTime() - link.timestamp;
fml::TimePoint frame_start_time = fml::TimePoint::Now() - fml::TimeDelta::FromSecondsF(delay);

CFTimeInterval duration = link.targetTimestamp - link.timestamp;
fml::TimePoint frame_target_time = frame_start_time + fml::TimeDelta::FromSecondsF(duration);

TRACE_EVENT2_INT("flutter", "PlatformVsync", "frame_start_time",
frame_start_time.ToEpochDelta().ToMicroseconds(), "frame_target_time",
frame_target_time.ToEpochDelta().ToMicroseconds());

std::unique_ptr<flutter::FrameTimingsRecorder> recorder =
std::make_unique<flutter::FrameTimingsRecorder>();

Expand Down

0 comments on commit 8f6036e

Please sign in to comment.