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

Defer image asset regeneration to draw loop #1663

Merged
merged 5 commits into from
Sep 7, 2019
Merged

Conversation

mikezucc
Copy link
Contributor

@mikezucc mikezucc commented Sep 6, 2019

There is a potential dealloc race condition that can occur when attempting to perform work with image asset out of the main thread. Moving that work into the image node draw loop if necessary

Source/ASImageNode.mm Outdated Show resolved Hide resolved
@rahul-malik rahul-malik merged commit 5e7fbf2 into master Sep 7, 2019
bdolman added a commit to Hitlabs/Texture that referenced this pull request Nov 24, 2021
Before this change, the image asset (which may contain multiple reps
of an image for differing traits) was only consulted when the trait
collection changed. But in cases where display was scheduled
on the node and the trait collection had not changed, the image node
ends up with the default representation instead.

An example of this:

You have an image asset with two versions: light (default) and dark.
The device is currently in dark mode
The image is being presented in an item in a collection node.

1. Item node is first added to hierarchy. Trait collection doesn't match
so regenerateFromImageAsset=true.
2. Dark image is rendered, as expected
3. Item node is scrolled off screen
4. Item is scrolled back on screen
5. This triggers display on the item node
6. Trait collection has NOT changed so regenerateFromImageAsset=false
7. So, imageAsset is not consulted and default (Light) image is rendered

After looking at this a lot, I don’t see any reason why we need the
regenerateFromImageAsset flag at all (introduced in TextureGroup#1663).  Whenever
the image node is displayed we need to make sure we are generating the
correct representation.
bdolman added a commit to Hitlabs/Texture that referenced this pull request Nov 24, 2021
Before this change, the image asset (which may contain multiple reps
of an image for differing traits) was only consulted when the trait
collection changed. But in cases where display was scheduled
on the node and the trait collection had not changed, the image node
ends up with the default representation instead.

An example of this:

You have an image asset with two versions: light (default) and dark.
The device is currently in dark mode
The image is being presented in an item in a collection node.

1. Item node is first added to hierarchy. Trait collection doesn't match
so regenerateFromImageAsset=true.
2. Dark image is rendered, as expected
3. Item node is scrolled off screen
4. Item is scrolled back on screen
5. This triggers display on the item node
6. Trait collection has NOT changed so regenerateFromImageAsset=false
7. So, imageAsset is not consulted and default (Light) image is rendered

After looking at this a lot, I don’t see any reason why we need the
regenerateFromImageAsset flag at all (introduced in TextureGroup#1663).  Whenever
the image node is displayed we need to make sure we are generating the
correct representation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants