From 9b9f73ca641c7513d7e8acde756b38aff6fd6d81 Mon Sep 17 00:00:00 2001 From: zhongwuzw Date: Thu, 29 Oct 2020 15:57:34 +0800 Subject: [PATCH 1/2] [iOS] Fixes DisplayLinkManager leaks --- .../ios/framework/Source/FlutterEngine.mm | 2 +- .../ios/framework/Source/vsync_waiter_ios.h | 4 +-- .../ios/framework/Source/vsync_waiter_ios.mm | 32 ++++++------------- 3 files changed, 11 insertions(+), 27 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm b/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm index cbd93e978fd6a..8d563618b0a78 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm @@ -570,7 +570,7 @@ - (BOOL)createShell:(NSString*)entrypoint } - (void)initializeDisplays { - double refresh_rate = [[[DisplayLinkManager alloc] init] displayRefreshRate]; + double refresh_rate = [DisplayLinkManager displayRefreshRate]; auto display = flutter::Display(refresh_rate); _shell->OnDisplayUpdates(flutter::DisplayUpdateType::kStartup, {display}); } diff --git a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h index cd34590e11db0..e4b0aedac2055 100644 --- a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h +++ b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h @@ -12,8 +12,6 @@ @interface DisplayLinkManager : NSObject -- (instancetype)init; - //------------------------------------------------------------------------------ /// @brief The display refresh rate used for reporting purposes. The engine does not care /// about this for frame scheduling. It is only used by tools for instrumentation. The @@ -23,7 +21,7 @@ /// /// @return The refresh rate in frames per second. /// -- (double)displayRefreshRate; ++ (double)displayRefreshRate; @end diff --git a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm index df4e289fc436c..520873e87a207 100644 --- a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm +++ b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm @@ -91,26 +91,18 @@ - (void)dealloc { @end -@implementation DisplayLinkManager { - fml::scoped_nsobject display_link_; -} +@implementation DisplayLinkManager -- (instancetype)init { - self = [super init]; - - if (self) { - display_link_ = fml::scoped_nsobject { - [[CADisplayLink displayLinkWithTarget:self selector:@selector(onDisplayLink:)] retain] ++ (double)displayRefreshRate { + if (@available(iOS 10.3, *)) { + fml::scoped_nsobject display_link = fml::scoped_nsobject { + [[CADisplayLink displayLinkWithTarget:[[DisplayLinkManager new] autorelease] + selector:@selector(onDisplayLink:)] retain] }; - display_link_.get().paused = YES; - } + display_link.get().paused = YES; + auto preferredFPS = display_link.get().preferredFramesPerSecond; // iOS 10.0 - return self; -} - -- (double)displayRefreshRate { - if (@available(iOS 10.3, *)) { - auto preferredFPS = display_link_.get().preferredFramesPerSecond; // iOS 10.0 + display_link.reset(); // From Docs: // The default value for preferredFramesPerSecond is 0. When this value is 0, the preferred @@ -131,10 +123,4 @@ - (void)onDisplayLink:(CADisplayLink*)link { // no-op. } -- (void)dealloc { - [display_link_.get() invalidate]; - - [super dealloc]; -} - @end From 17cbe3375d3c5717cf845ff81e7ee982601890e1 Mon Sep 17 00:00:00 2001 From: zhongwuzw Date: Sat, 21 Nov 2020 12:14:56 +0800 Subject: [PATCH 2/2] Remove unnecessary reset --- shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm | 2 -- 1 file changed, 2 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm index 520873e87a207..d71ecd7d783df 100644 --- a/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm +++ b/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm @@ -102,8 +102,6 @@ + (double)displayRefreshRate { display_link.get().paused = YES; auto preferredFPS = display_link.get().preferredFramesPerSecond; // iOS 10.0 - display_link.reset(); - // From Docs: // The default value for preferredFramesPerSecond is 0. When this value is 0, the preferred // frame rate is equal to the maximum refresh rate of the display, as indicated by the