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

Pull out LottieComposition factory methods into inner class #137

Merged
merged 6 commits into from
Feb 21, 2017

Conversation

felipecsl
Copy link
Collaborator

@felipecsl felipecsl commented Feb 21, 2017

Summary of changes

This is part of issue #3. Pulled static factory methods out of LottieComposition into a static inner class. Made all fields final and initialized them all in the constructor.
This will make it easier for follow up refactors where we'll modularize the parsing logic and make it pluggable.
Also upgraded the Espresso tests to JUnit 4 so it no longer uses the deprecated ActivityInstrumentationTestCase2

Testing

Ran ./gradlew recordMode screenshotTests and saw no changes to screenshot files.

cc @hzsweers

Copy link
Collaborator

@gpeal gpeal left a comment

Choose a reason for hiding this comment

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

👍 Nice cleanup. It will be great once all of the parsing code is isolated.

@gpeal gpeal merged commit c5a6daf into master Feb 21, 2017
@gpeal gpeal deleted the felipe/pluggable-json branch February 21, 2017 02:32
gpeal added a commit that referenced this pull request Jan 9, 2018
Previously, Lottie used JsonObject for deserialization. That meant that:
1) Deserialization is not guaranteed to be O(n) where n is the size of the json file.
2) The entire json string must be loaded into memory.

Switching to JsonReader has the following advantages:
1) Reading is guaranteed to be O(n).
2) Large files can be read in buffers.

However, deserialization code is much more cumbersome because you can't query for things like the existence of a key, the length of an array, and you can't re-walk the same part of the json multiple times.

@felipecsl Did some work (#137, #139, #145, #152) a year ago to prepare to decouple parsing logic so that people could use jackson or some other method of deserialization. However, JsonReader is now the most optimal solution so some of the factory code can be simplified in a future PR.

## Performance
Most animations deserialize ~50% faster than before.
I was also able to deserialize a 50mb json file in 10s that couldn't come close to completing without OOMing before.

|Animation|Old time (ms)|New time (ms)|% improvement|
|----------|--------------|--------------|----------------|
|Tadah|107|55|48%|
|Nudge|100|51|49%|
|Notifications|85|48|43%|
|Star Wars|74|41|45%|
|City|65|24|64%|
|9squares|17|7|59%|
|Empty State|9|4|56%|
|Hello World|6|2|66%|
|Hamburger Arrow|2|1|50%|

Fixes #39
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.

2 participants