Skip to content

Commit

Permalink
Disable all rasterizer work while backgrounded on iOS (flutter#4002)
Browse files Browse the repository at this point in the history
On iOS, backgrounded applications are not permitted to execute GPU work.
See [1].  When backgrounding the application, we now tear down the
underlying iOS render surface, and re-create when the app returns to
foreground.

See [2] for a Technica Q&A on GL-related crashes when rendering is
attempted by a backgrounded application.

[1]: https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/ImplementingaMultitasking-awareOpenGLESApplication/ImplementingaMultitasking-awareOpenGLESApplication.html#//apple_ref/doc/uid/TP40008793-CH5-SW1
[2]: https://developer.apple.com/library/content/qa/qa1766/_index.html
  • Loading branch information
cbracken authored Aug 23, 2017
1 parent e887718 commit 0062701
Showing 1 changed file with 4 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ - (void)loadView {
- (void)surfaceUpdated:(BOOL)appeared {
FTL_CHECK(_platformView != nullptr);

// NotifyCreated/NotifyDestroyed are synchronous and require hops between the UI and GPU thread.
if (appeared) {
_platformView->NotifyCreated();
} else {
Expand Down Expand Up @@ -377,11 +378,14 @@ - (void)applicationWillResignActive:(NSNotification*)notification {

- (void)applicationDidEnterBackground:(NSNotification*)notification {
TRACE_EVENT0("flutter", "applicationDidEnterBackground");
[self surfaceUpdated:NO];
[_lifecycleChannel.get() sendMessage:@"AppLifecycleState.paused"];
}

- (void)applicationWillEnterForeground:(NSNotification*)notification {
TRACE_EVENT0("flutter", "applicationWillEnterForeground");
if (_viewportMetrics.physical_width)
[self surfaceUpdated:YES];
[_lifecycleChannel.get() sendMessage:@"AppLifecycleState.inactive"];
}

Expand Down

0 comments on commit 0062701

Please sign in to comment.