-
Notifications
You must be signed in to change notification settings - Fork 6k
Improve caching limits for Skia #9503
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -610,6 +610,16 @@ void Shell::OnPlatformViewSetViewportMetrics(const ViewportMetrics& metrics) { | |||||||||||||||
| FML_DCHECK(is_setup_); | ||||||||||||||||
| FML_DCHECK(task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()); | ||||||||||||||||
|
|
||||||||||||||||
| // This is the formula Android uses. | ||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Where is this method called from? On android it looks like the engine method is called directly:
iOS looks like it does the same:
I'm not seeing this code getting run unless I add
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is called by the embedders when the tell the PlatformView to update the viewport metrics. On iOS, this happens in response to a few things in FlutterViewController's lifecycle, and is funnled through here: https://github.com/flutter/engine/blob/master/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm#L674 On Android, that call results from similar things in FlutterView.java which all funnel through https://github.com/flutter/engine/blob/master/shell/platform/android/io/flutter/view/FlutterView.java#L614. Unless you're writing your own embedding, you should never call this method. The reason I put the change here is because this is the method where we learn about screen resolution changes, and we want the cache size to be based on a multiple of screen resolution. It's possible to override that entirely by using the
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you go down the callstack from FlutterView.java you don't get here, you get to the engine call.
Before this change calling the engine SetViewportMetrics was equivalent to calling the platform view wrapper around it. Its not after this change.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ahh that's unexpected. The other similar methods in the JNI platform view just forward to platform view. I think it'd be reasonable to change this one to do the same. Woudl that unstick you?
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When I add that line the engine crashes in release mode because surface_ seems to be null here: engine/shell/common/rasterizer.cc Line 424 in 2284210
I'm not sure why surface_ is null in release mode but not debug mode.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It depends on where you're calling this - the surface may not have been set up yet and perhaps there's some race condition...
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I mentioned this on #9729, but since the effect of this change seems to have been to reduce the default cache size from 512mb to 24mb should it be rolled back? |
||||||||||||||||
| // https://android.googlesource.com/platform/frameworks/base/+/master/libs/hwui/renderthread/CacheManager.cpp#41 | ||||||||||||||||
| int max_bytes = metrics.physical_width * metrics.physical_height * 12 * 4; | ||||||||||||||||
| task_runners_.GetGPUTaskRunner()->PostTask( | ||||||||||||||||
| [rasterizer = rasterizer_->GetWeakPtr(), max_bytes] { | ||||||||||||||||
| if (rasterizer) { | ||||||||||||||||
| rasterizer->SetResourceCacheMaxBytes(max_bytes, false); | ||||||||||||||||
| } | ||||||||||||||||
| }); | ||||||||||||||||
|
|
||||||||||||||||
| task_runners_.GetUITaskRunner()->PostTask( | ||||||||||||||||
| [engine = engine_->GetWeakPtr(), metrics]() { | ||||||||||||||||
| if (engine) { | ||||||||||||||||
|
|
@@ -863,7 +873,8 @@ void Shell::HandleEngineSkiaMessage(fml::RefPtr<PlatformMessage> message) { | |||||||||||||||
| [rasterizer = rasterizer_->GetWeakPtr(), | ||||||||||||||||
| max_bytes = args->value.GetInt()] { | ||||||||||||||||
| if (rasterizer) { | ||||||||||||||||
| rasterizer->SetResourceCacheMaxBytes(max_bytes); | ||||||||||||||||
| rasterizer->SetResourceCacheMaxBytes(static_cast<size_t>(max_bytes), | ||||||||||||||||
| true); | ||||||||||||||||
| } | ||||||||||||||||
| }); | ||||||||||||||||
| } | ||||||||||||||||
|
|
||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It may just be more future-proof to make this
std::atomic<bool>in case that someone mistakenly modified it on other threads (than the GPU thread) in a future PR. Considering the low frequency of reading/writing this bit, the overhead of that atomic bool should be negligible.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The rasterizer is only accessed on the GPU thread. I'd prefer not to imply that any part of the rasterizer is safe to access from other threads.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, this is in
Rasterizer, notShell. Ignore my earlier comment :)There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How about if I check that the method using it runs on the GPU thread?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't worry about it @dnfield . All fields of
Rasterizerare only safe inside the GPU thread. So there's little reason to just guard this single field by making your change more complex.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nevermind, I see what you're saying - just switched it to std::atomic
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Haha - Github did not refresh on me. Ok, reverted back.