@@ -13,7 +13,6 @@ @interface FlutterDisplayLink () {
1313 _FlutterDisplayLinkView* _view;
1414 std::optional<CGDirectDisplayID> _display_id;
1515 void (^_block)(CFTimeInterval timestamp, CFTimeInterval targetTimestamp);
16-
1716 BOOL _paused;
1817}
1918
@@ -60,10 +59,11 @@ bool ShouldBeRunning() {
6059 std::mutex mutex_;
6160};
6261
63- void RunOrStopDisplayLink (CVDisplayLinkRef display_link, bool should_run) {
64- if (should_run) {
62+ void RunOrStopDisplayLink (CVDisplayLinkRef display_link, bool should_be_running) {
63+ bool is_running = CVDisplayLinkIsRunning (display_link);
64+ if (should_be_running && !is_running) {
6565 CVDisplayLinkStart (display_link);
66- } else {
66+ } else if (!should_be_running && is_running) {
6767 CVDisplayLinkStop (display_link);
6868 }
6969}
@@ -84,10 +84,10 @@ void RunOrStopDisplayLink(CVDisplayLinkRef display_link, bool should_run) {
8484 CVDisplayLinkRelease (display_link);
8585 } else {
8686 // Update the display link state outside of the mutex.
87- bool running = entry->ShouldBeRunning ();
87+ bool should_be_running = entry->ShouldBeRunning ();
8888 CVDisplayLinkRef display_link = CVDisplayLinkRetain (entry->display_link_locked );
8989 lock.unlock ();
90- RunOrStopDisplayLink (display_link, running );
90+ RunOrStopDisplayLink (display_link, should_be_running );
9191 CVDisplayLinkRelease (display_link);
9292 }
9393 return ;
@@ -101,10 +101,10 @@ void RunOrStopDisplayLink(CVDisplayLinkRef display_link, bool should_run) {
101101 for (ScreenEntry& entry : entries_) {
102102 if (entry.display_id == display_id) {
103103 entry.clients .push_back (displayLink);
104- bool running = entry.ShouldBeRunning ();
104+ bool should_be_running = entry.ShouldBeRunning ();
105105 CVDisplayLinkRef display_link = CVDisplayLinkRetain (entry.display_link_locked );
106106 lock.unlock ();
107- RunOrStopDisplayLink (display_link, running );
107+ RunOrStopDisplayLink (display_link, should_be_running );
108108 CVDisplayLinkRelease (display_link);
109109 return ;
110110 }
@@ -124,8 +124,8 @@ void RunOrStopDisplayLink(CVDisplayLinkRef display_link, bool should_run) {
124124 });
125125
126126 // This is a new display link so it is safe to start it with mutex held.
127- bool running = entry.ShouldBeRunning ();
128- RunOrStopDisplayLink (entry.display_link_locked , running );
127+ bool should_be_running = entry.ShouldBeRunning ();
128+ RunOrStopDisplayLink (entry.display_link_locked , should_be_running );
129129 entries_.push_back (entry);
130130}
131131
0 commit comments