15
15
#include " flutter/fml/memory/task_runner_checker.h"
16
16
#include " flutter/fml/trace_event.h"
17
17
18
+ @interface VSyncClient ()
19
+ @property (nonatomic , assign , readonly ) double refreshRate;
20
+ @end
21
+
18
22
// When calculating refresh rate diffrence, anything within 0.1 fps is ignored.
19
23
const static double kRefreshRateDiffToIgnore = 0.1 ;
20
24
29
33
};
30
34
client_ = [[VSyncClient alloc ] initWithTaskRunner: task_runners_.GetUITaskRunner ()
31
35
callback: callback];
32
- max_refresh_rate_ = [ DisplayLinkManager displayRefreshRate ] ;
36
+ max_refresh_rate_ = DisplayLinkManager. displayRefreshRate ;
33
37
}
34
38
35
39
VsyncWaiterIOS::~VsyncWaiterIOS () {
39
43
}
40
44
41
45
void VsyncWaiterIOS::AwaitVSync () {
42
- double new_max_refresh_rate = [ DisplayLinkManager displayRefreshRate ] ;
46
+ double new_max_refresh_rate = DisplayLinkManager. displayRefreshRate ;
43
47
if (fabs (new_max_refresh_rate - max_refresh_rate_) > kRefreshRateDiffToIgnore ) {
44
48
max_refresh_rate_ = new_max_refresh_rate;
45
49
[client_ setMaxRefreshRate: max_refresh_rate_];
49
53
50
54
// |VariableRefreshRateReporter|
51
55
double VsyncWaiterIOS::GetRefreshRate () const {
52
- return [ client_ getRefreshRate ] ;
56
+ return client_. refreshRate ;
53
57
}
54
58
55
59
} // namespace flutter
56
60
57
61
@implementation VSyncClient {
58
- flutter::VsyncWaiter::Callback callback_ ;
62
+ flutter::VsyncWaiter::Callback _callback ;
59
63
CADisplayLink * _displayLink;
60
- double current_refresh_rate_;
61
64
}
62
65
63
66
- (instancetype )initWithTaskRunner : (fml::RefPtr<fml::TaskRunner>)task_runner
64
67
callback : (flutter::VsyncWaiter::Callback)callback {
65
68
self = [super init ];
66
69
67
70
if (self) {
68
- current_refresh_rate_ = [ DisplayLinkManager displayRefreshRate ] ;
71
+ _refreshRate = DisplayLinkManager. displayRefreshRate ;
69
72
_allowPauseAfterVsync = YES ;
70
- callback_ = std::move (callback);
73
+ _callback = std::move (callback);
71
74
_displayLink = [CADisplayLink displayLinkWithTarget: self selector: @selector (onDisplayLink: )];
72
75
_displayLink.paused = YES ;
73
76
74
- [self setMaxRefreshRate: [ DisplayLinkManager displayRefreshRate ] ];
77
+ [self setMaxRefreshRate: DisplayLinkManager. displayRefreshRate];
75
78
76
79
// Strongly retain the the captured link until it is added to the runloop.
77
80
CADisplayLink * localDisplayLink = _displayLink;
78
81
task_runner->PostTask ([localDisplayLink]() {
79
- [localDisplayLink addToRunLoop: [ NSRunLoop currentRunLoop ] forMode: NSRunLoopCommonModes ];
82
+ [localDisplayLink addToRunLoop: NSRunLoop . currentRunLoop forMode: NSRunLoopCommonModes ];
80
83
});
81
84
}
82
85
@@ -119,28 +122,20 @@ - (void)onDisplayLink:(CADisplayLink*)link {
119
122
std::unique_ptr<flutter::FrameTimingsRecorder> recorder =
120
123
std::make_unique<flutter::FrameTimingsRecorder>();
121
124
122
- current_refresh_rate_ = round (1 / (frame_target_time - frame_start_time).ToSecondsF ());
125
+ _refreshRate = round (1 / (frame_target_time - frame_start_time).ToSecondsF ());
123
126
124
127
recorder->RecordVsync (frame_start_time, frame_target_time);
125
128
if (_allowPauseAfterVsync) {
126
129
link .paused = YES ;
127
130
}
128
- callback_ (std::move (recorder));
131
+ _callback (std::move (recorder));
129
132
}
130
133
131
134
- (void )invalidate {
132
135
[_displayLink invalidate ];
133
136
_displayLink = nil ; // Break retain cycle.
134
137
}
135
138
136
- - (void )dealloc {
137
- [_displayLink invalidate ];
138
- }
139
-
140
- - (double )getRefreshRate {
141
- return current_refresh_rate_;
142
- }
143
-
144
139
- (CADisplayLink *)getDisplayLink {
145
140
return _displayLink;
146
141
}
@@ -164,15 +159,15 @@ + (double)displayRefreshRate {
164
159
return preferredFPS;
165
160
}
166
161
167
- return [ UIScreen mainScreen ] .maximumFramesPerSecond ;
162
+ return UIScreen. mainScreen .maximumFramesPerSecond ;
168
163
}
169
164
170
165
- (void )onDisplayLink : (CADisplayLink *)link {
171
166
// no-op.
172
167
}
173
168
174
169
+ (BOOL )maxRefreshRateEnabledOnIPhone {
175
- return [[[ NSBundle mainBundle ] objectForInfoDictionaryKey: @" CADisableMinimumFrameDurationOnPhone" ]
170
+ return [[NSBundle . mainBundle objectForInfoDictionaryKey: @" CADisableMinimumFrameDurationOnPhone" ]
176
171
boolValue ];
177
172
}
178
173
0 commit comments