-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
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
Reanimated Stops Working Completely on iOS #6371
Comments
Just added a $512 sponsorship and am happy to pay $128/hour for the time to fix this. This is affecting us in production and would really appreciate if you guys could prioritize the issue. |
Hi @phantom-xrn, thanks for reporting this issue as well as preparing the minimal reproducible example. Could you please contact us at projects@swmansion.com? We'd be happy to prioritize work this issue. |
Hi @phantom-xrn I prepared a PR #6442 that should resolve this issue. We might need some time to get it merged, since it has to do with an important part of our logic. Until then you can use this patch on your app. |
## Summary Currently we schedule`rAF` flush when the first callback is added to the list. However the flush method can also be called by an event, meaning that sometimes we have a flush scheduled to run on a given frame, but the callbacks array is empty. If then, another callback is requested, the array will contain 1 element, triggering another flush request (even though one is already scheduled). To prevent this, from causing countless requests on a singe frame we check the frame timestamp and abort if it's repeated. This approach unfortunately causes some problems when video is playing in the app. On iPhone devices sometimes the displayLink can fire its callback twice in a single frame (with the same timestamp). This leads to us cancelling the `rAF` flush, which means that until an event triggers a flush, none updates from reanimated will come through. This PR changes the way we request a flush. Instead of checking the callbacks array size, we instead remember whether a flush was requested and request a new one only when there was no request. This prevents us from requesting unnecessary flushes when an event has caused the callbacks array to be emptied, while also allowing for repeated frame timestamps. closes #6371 ## Test plan Check for regressions in the example app and in this example: https://gist.github.com/kmagiera/b2df85f9512951f5e6ceee7bc569f5f1
## Summary Currently we schedule`rAF` flush when the first callback is added to the list. However the flush method can also be called by an event, meaning that sometimes we have a flush scheduled to run on a given frame, but the callbacks array is empty. If then, another callback is requested, the array will contain 1 element, triggering another flush request (even though one is already scheduled). To prevent this, from causing countless requests on a singe frame we check the frame timestamp and abort if it's repeated. This approach unfortunately causes some problems when video is playing in the app. On iPhone devices sometimes the displayLink can fire its callback twice in a single frame (with the same timestamp). This leads to us cancelling the `rAF` flush, which means that until an event triggers a flush, none updates from reanimated will come through. This PR changes the way we request a flush. Instead of checking the callbacks array size, we instead remember whether a flush was requested and request a new one only when there was no request. This prevents us from requesting unnecessary flushes when an event has caused the callbacks array to be emptied, while also allowing for repeated frame timestamps. closes #6371 ## Test plan Check for regressions in the example app and in this example: https://gist.github.com/kmagiera/b2df85f9512951f5e6ceee7bc569f5f1
@phantom-xrn We just published a new version of reanimated (3.15.1) that includes this fix. |
Description
Reanimated completely stops working after a while on production on iOS. I've attached a video and a minimum reproducible repo.
Some thoughts:
IMG_0132.3.mp4
Steps to reproduce
Clone https://github.com/phantom-xrn/reanimated-bug/tree/main
Unbalanced calls start/end for tag 19
Snack or a link to a repository
https://github.com/phantom-xrn/reanimated-bug/tree/main
Reanimated version
3.14.0
React Native version
0.73.6
Platforms
iOS
JavaScript runtime
Hermes
Workflow
Expo Dev Client
Architecture
Paper (Old Architecture)
Build type
Release app & production bundle
Device
Real device
Device model
Iphone 15 Pro
Acknowledgements
Yes
The text was updated successfully, but these errors were encountered: