Files
flutter/engine
Matej Knopp 3237222b62 [macOS] Implement merged UI and platform thread (#162883)
Original issue: https://github.com/flutter/flutter/issues/150525

This PR lets the macOS embedder run both with and without UI and
platform thread merged.

Thread merging is controlled through `FLTEnableMergedPlatformUIThread`
`info.plist` option similar to iOS embedder, though the default value is
currently `false`.

Changes in the resize / vsync synchronization:

- Added `FlutterRunLoop` class to schedule Flutter tasks on main thread
in a way where it is possible to only process these (Flutter posted)
tasks while waiting for correct frame size during resizing. This
significantly simplifies the resize synchronization and makes the same
code work both with separate UI thread and with UI and platform thread
merged.
- `FlutterThreadSynchronizer` has been renamed to
`FlutterResizeSynchronizer` vastly simplified, mutex and conditions are
removed and the blocking is now done by only processing Flutter messages
while waiting for resizing. It is now per view (instead of storing a
viewId->Size map internally) and owned by the view itself, instead of
engine.
- This approach to resize synchronization will work for Windows and
Linux as well. This will allow us to conceptually consolidate the way we
do threading and resize synchronization on all three desktop embedders.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
2025-04-03 15:25:17 +00:00
..

Flutter Engine

Setting up the Engine development environment

See here

gclient bootstrap

Flutter engine uses gclient to manage dependencies.

If you've already cloned the flutter repository:

  1. Copy one of the engine/scripts/*.gclient to the root folder as .gclient:
    1. Googlers: copy rbe.gclient to enable faster builds with RBE
    2. Everyone else: copy standard.gclient
  2. run gclient sync from the root folder