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

Commit 6ef81fe

Browse files
committed
Add FlutterDisplayLinkTest.CVDisplayLinkInterval test
1 parent 03ebb2a commit 6ef81fe

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

shell/platform/darwin/macos/framework/Source/FlutterDisplayLinkTest.mm

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterDisplayLink.h"
66

77
#import <AppKit/AppKit.h>
8+
#include <numeric>
89

910
#include "flutter/fml/synchronization/waitable_event.h"
1011
#include "flutter/testing/testing.h"
@@ -148,3 +149,32 @@ - (void)onDisplayLink:(CFTimeInterval)timestamp targetTimestamp:(CFTimeInterval)
148149

149150
[displayLink invalidate];
150151
}
152+
153+
TEST(FlutterDisplayLinkTest, CVDisplayLinkInterval) {
154+
CVDisplayLinkRef link;
155+
CVDisplayLinkCreateWithCGDisplay(CGMainDisplayID(), &link);
156+
__block CFTimeInterval last = 0;
157+
__block auto intervals = std::make_unique<std::vector<CFTimeInterval>>();
158+
__block auto event = std::make_unique<fml::AutoResetWaitableEvent>();
159+
CVDisplayLinkSetOutputHandler(
160+
link, ^(CVDisplayLinkRef displayLink, const CVTimeStamp* inNow,
161+
const CVTimeStamp* inOutputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut) {
162+
if (last != 0) {
163+
intervals->push_back(CACurrentMediaTime() - last);
164+
}
165+
last = CACurrentMediaTime();
166+
if (intervals->size() == 10) {
167+
event->Signal();
168+
}
169+
return 0;
170+
});
171+
172+
CVDisplayLinkStart(link);
173+
event->Wait();
174+
CVDisplayLinkStop(link);
175+
CVDisplayLinkRelease(link);
176+
CFTimeInterval average = std::reduce(intervals->begin(), intervals->end()) / intervals->size();
177+
CFTimeInterval max = *std::max_element(intervals->begin(), intervals->end());
178+
CFTimeInterval min = *std::min_element(intervals->begin(), intervals->end());
179+
NSLog(@"CVDisplayLink Interval: Average: %fs, Max: %fs, Min: %fs", average, max, min);
180+
}

0 commit comments

Comments
 (0)