The Animation Compression Library just got even faster
15 Apr 2019Slowly but surely, the Animation Compression Library has now reached v1.2 along with an updated v0.3 Unreal Engine 4 plugin. The most notable changes in this release are as follow:
- More compilers and architectures added to continuous integration
- Accuracy bug fixes
- Floating point sample rate support
- Dramatically faster compression through the introduction of a compression level setting
TL;DR: Compared to UE 4.19.2, the ACL plugin compresses up to 1.7x smaller, is up to 3x more accurate, up to 158x faster to compress, and up to 7.5x faster to decompress (results may vary depending on the platform and data).
Note that UE 4.21 introduced changes that significantly sped up the compression with its Automatic Compression codec but I haven’t had the time to setup a new branch with it to measure.
UE 4 plugin support and progress
Now that ACL properly supports a floating point sample rate, the UE4 plugin has reached feature parity with the stock codecs.
As announced at the GDC 2019, work is ongoing to refactor the Unreal Engine to natively support animation compression plugins and is currently on track to land with UE 4.23. Once it does, the plugin will be updated once more, finally reaching v1.0 on the Unreal marketplace for free.
Lighting fast compression
One of the most common feedback I received from those that use ACL in the wild (both within UE4 and outside) was the desire for faster compression. The optimization algorithm is very aggressive and despite its impressive performance overall (as highlighted in prior releases), some clips with deep bone hierarchies could take a very long time to compress, prohibitively so.
In order to address this, a new compression level was introduced in the compression settings to better control how much time should be spent attempting to find an optimal bit rate. Higher levels take more time but yield a lower memory footprint. A total of five levels were introduced but the lowest three currently behave the same for now: Lowest, Low, Medium, High, Highest. The Highest level corresponds to what prior releases did by default. After carefully reviewing the impact of each level, a decision was made to make the default level be Medium instead. This translates in dramatically faster compression, identical accuracy, with a very small and acceptable increase in memory footprint. This should provide for a much better experience for animators during production. Once the game is ready to be released, the animations can easily and safely be recompressed with the Highest setting in order to squeeze out every byte.
In order to extract the following results, I compressed the Carnegie-Mellon University motion capture database, Paragon, and Fortnite in parallel with 4 threads using ACL standalone. Numbers in parenthesis represent the delta again Highest.
Compressed Size | Highest | High | Medium |
---|---|---|---|
CMU | 67.05 MB | 68.85 MB (+2.7%) | 71.01 MB (+5.9%) |
Paragon | 206.87 MB | 211.81 MB (+2.4%) | 218.58 MB (+5.7%) |
Fortnite | 491.79 MB | 497.60 MB (+1.2%) | 507.11 MB (+3.1%) |
Compression Time | Highest | High | Medium |
---|---|---|---|
CMU | 24m 57.59s | 11m 51.48s | 6m 20.89s |
Paragon | 4h 55m 42.57s | 1h 19m 36.01s | 29m 21.65s |
Fortnite | 8h 13m 1.66s | 2h 29m 59.37s | 1h 3m 18.17s |
Compression Speed | Highest | High | Medium |
---|---|---|---|
CMU | 977.36 KB/sec | 2057.24 KB/sec (+2.1x) | 3842.79 KB/sec (+3.9x) |
Paragon | 246.79 KB/sec | 916.82 KB/sec (+3.7x) | 2485.58 KB/sec (+10.1x) |
Fortnite | 613.56 KB/sec | 2016.82 KB/sec (+3.3x) | 4778.65 KB/sec (+7.8x) |
And here are the default settings in action on the animations from Paragon with the ACL plugin inside UE4:
ACL Plugin v0.3.0 | ACL Plugin v0.2.0 | UE v4.19.2 | |
---|---|---|---|
Compressed size | 234.76 MB | 226.09 MB | 392.97 MB |
Compression ratio | 18.22 : 1 | 18.91 : 1 | 10.88 : 1 |
Compression time | 30m 14.69s | 6h 4m 18.21s | 15h 10m 23.56s |
Compression speed | 2412.94 KB/sec | 200.32 KB/sec | 80.16 KB/sec |
Max ACL error | 0.8623 cm | 0.8590 cm | 0.8619 cm |
Max UE4 error | 0.8601 cm | 0.8566 cm | 0.6424 cm |
ACL Error 99th percentile | 0.0094 cm | 0.0116 cm | 0.0328 cm |
Samples below ACL error threshold | 99.19 % | 98.85 % | 84.88 % |
The 99th percentile and the number of samples below the 0.01 cm error threshold are calculated by measuring the error of every bone at every sample in each of the 6558 animation clips. More details on how the error is measured can be found here.
In this new release, the decompression performance remains largely unchanged. It is worth noting that a month ago my Google Nexus 5X died abruptly and as such performance numbers will no longer be tracked on it. Instead, my new Google Pixel 3 will be used from here on out.
What’s next
The next release v1.3 currently scheduled for the Fall 2019 will aim to tackle commonly requested features:
- Faster decompression in long clips by optimizing seeking
- Multiple root transform support (e.g. rigid body simulation compression)
- Scalar track support (e.g. float curves for blend shapes)
- Faster compression in part by using multiple threads to compress a single clip (which will help the UE4 plugin a lot)
If you use ACL and would like to help prioritize the work I do, feel free to reach out and provide feedback or requests!