29void VsyncWaiterAndroid::AwaitVSync() {
30 const static bool use_choreographer =
32 if (use_choreographer) {
33 auto* weak_this =
new std::weak_ptr<VsyncWaiter>(shared_from_this());
37 const auto& choreographer =
38 impeller::android::Choreographer::GetInstance();
39 choreographer.PostFrameCallback([weak_this](auto time) {
41 std::chrono::time_point_cast<std::chrono::nanoseconds>(time)
44 OnVsyncFromNDK(time_ns, weak_this);
50 auto* weak_this =
new std::weak_ptr<VsyncWaiter>(shared_from_this());
51 jlong java_baton =
reinterpret_cast<jlong
>(weak_this);
64void VsyncWaiterAndroid::OnVsyncFromNDK(int64_t frame_nanos,
void*
data) {
68 if (frame_time > now) {
72 1000000000.0 / g_refresh_rate_);
75 frame_time.ToEpochDelta().ToMicroseconds(),
77 target_time.ToEpochDelta().ToMicroseconds());
79 auto* weak_this =
reinterpret_cast<std::weak_ptr<VsyncWaiter>*
>(
data);
80 ConsumePendingCallback(weak_this, frame_time, target_time);
84void VsyncWaiterAndroid::OnVsyncFromJava(JNIEnv* env,
86 jlong frameDelayNanos,
87 jlong refreshPeriodNanos,
95 frame_time.ToEpochDelta().ToMicroseconds(),
97 target_time.ToEpochDelta().ToMicroseconds());
99 auto* weak_this =
reinterpret_cast<std::weak_ptr<VsyncWaiter>*
>(java_baton);
100 ConsumePendingCallback(weak_this, frame_time, target_time);
104void VsyncWaiterAndroid::ConsumePendingCallback(
105 std::weak_ptr<VsyncWaiter>* weak_this,
108 auto shared_this = weak_this->lock();
112 shared_this->FireCallback(frame_start_time, frame_target_time);
117void VsyncWaiterAndroid::OnUpdateRefreshRate(JNIEnv* env,
119 jfloat refresh_rate) {
125bool VsyncWaiterAndroid::Register(JNIEnv* env) {
126 static const JNINativeMethod methods[] = {
128 .name =
"nativeOnVsync",
129 .signature =
"(JJJ)V",
130 .fnPtr =
reinterpret_cast<void*
>(&OnVsyncFromJava),
133 .name =
"nativeUpdateRefreshRate",
135 .fnPtr =
reinterpret_cast<void*
>(&OnUpdateRefreshRate),
138 jclass clazz = env->FindClass(
"io/flutter/embedding/engine/FlutterJNI");
140 if (clazz ==
nullptr) {
151 return env->RegisterNatives(clazz, methods, std::size(methods)) == 0;
fml::RefPtr< fml::TaskRunner > GetUITaskRunner() const
fml::RefPtr< fml::TaskRunner > GetPlatformTaskRunner() const
~VsyncWaiterAndroid() override
friend class VsyncWaiterAndroid
const TaskRunners task_runners_
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
virtual void PostTask(const fml::closure &task) override
static constexpr TimeDelta FromNanoseconds(int64_t nanos)
static constexpr TimePoint FromEpochDelta(TimeDelta ticks)
static bool IsAvailableOnPlatform()
TaskRunners task_runners_
#define FML_CHECK(condition)
#define FML_DCHECK(condition)
static fml::jni::ScopedJavaGlobalRef< jclass > * g_vsync_waiter_class
static jmethodID g_async_wait_for_vsync_method_
static std::atomic_uint g_refresh_rate_
JNIEnv * AttachCurrentThread()
std::shared_ptr< const fml::Mapping > data
#define TRACE_EVENT2_INT(category_group, name, arg1_name, arg1_val, arg2_name, arg2_val)