Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert #24222 and simply use invalidate instead of postInvalidate #24990

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

albyrock87
Copy link
Contributor

@albyrock87 albyrock87 commented Sep 29, 2024

Description of Change

#24222 broke reaction to shadow / clip changes.

This PR brings back the original code while replacing postInvalidate with invalidate to avoid countless scheduled invalidations considering that MAUI only operates on platform views through the main thread.

You can see more details in the issue's comments.

While CI regenerates the aar, we should commit the new aar once this is merged, or as part of this PR.
I've not included it for security reasons.

Issues Fixed

Fixes #24882

Copy link
Contributor

Hey there @albyrock87! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed.

@rmarinho rmarinho requested review from jonathanpeppers and removed request for Eilon September 30, 2024 13:52
@rmarinho
Copy link
Member

cc @jonathanpeppers

* @param hasClip
*/
protected final void setHasClip(boolean hasClip) {
if (this.hasClip != hasClip) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we remove the if? If the value for hasClip hasn't changed, why does it need to run invalidate()?

Does it actually need to be called in a different place in the stack? In .NET MAUI's C# layer, perhaps it would know what changed?

Copy link
Contributor Author

@albyrock87 albyrock87 Sep 30, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jonathanpeppers I've just done what you asked: revert your PR and use invalidate instead of postInvalidate.

That said:

  • setting a boolean field value has very likely no impact on performance, so the if is kind-of useless
  • this method is being called from the C# layer when the Clip changes, that's why we always need to invalidate
    • calling it from C# would cause two JNI roundtrips for nothing

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setting a boolean field value has very likely no impact on performance

Setting the field isn't the question, but the fact that invalidate() is called. Why do we need call invalidate() if true is set to true? or false set to false?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because the clip path or the shadow details like color, radius,... have changed.

Copy link
Contributor Author

@albyrock87 albyrock87 Sep 30, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should call these methods something like invalidateShadow(bool willDrawShadow) but it's a public API and I can't do that

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the clip path or shadow changes, should those be the things that call invalidate()?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reason to not move invalidate call there is just to avoid two round trips on JNI. So this is just a naming problem in my opinion.

* @param hasShadow
*/
protected final void setHasShadow(boolean hasShadow) {
if (this.hasShadow != hasShadow) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same question here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same answer here :D

@jonathanpeppers
Copy link
Member

/azp run

Copy link

Azure Pipelines successfully started running 3 pipeline(s).

Copy link
Member

@jonathanpeppers jonathanpeppers left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this fixes a new issue, changing postInvalidate() -> invalidate() will solve the performance issue from earlier.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
4 participants