fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

lottie-androidの色の補間処理の性能を改善するパッチが取り込まれた

これです

github.com

ChangelogにはMinor performance optimizationと書かれていることからもわかる通り全然大したことない改善なんだけど、今やっているプロジェクトではこういうのも馬鹿にはできないというレベルで厳しいので取り込んでもらえたのがありがたい。

どのような修正なのか

どんな修正かをざっくりいうと、GammaEvaluator.evaluate()という色の補間を行うメソッドに対して開始にも終了にも同じ色が渡された時、補間の計算をせずに開始の色をすぐ返すようにした、というもの。

ある色を目的の色までなめらかに変化させたいとき、時間の進捗に応じた”間の色”を計算(補間)しなければならない。lottie-androidでは補間の際にガンマ補正を行っているぶん、人の見た目にはより自然にみえるようになるものの時間がかかる。

この時刻からこの時刻までの間にAをBまで変化させるということを、lottie-androidではKeyframeというクラスで表現しており、動くと動かないとにかかわらず、Canvas(正確にはLayer)に書くものすべてがKeyframe(あるいはそのサブクラス)で表現される。Keyframeによっては色が変化しないというものもあるのだが、そのような場合にもlottie-androidでは色の補間計算を行うようになっていた。これは、ボトルネックを調べるためにAndroid StudioのプロファイラでJavaメソッドレコーディングをしたところ、色を変化させるアニメーションがないにもかかわらず件のメソッドが目に付くレベルで時間を消費していたことから発覚した。その部分のコードを読んでみて、大したインパクトはないかもしれないけど書き足す量もほんの少しだし、シンプルな変更なので特に異論なく取り込まれるのではないかと考えてプルリクを出した。

KeyframeにはisStatic()という真偽値を返すメソッドがあり、真の場合はそのKeyframeは時刻にかかわらず常に同じ値を返すというものなのだが、色のKeyframeの場合はそれが呼ばれず、色の補間を毎フレーム計算しているようだった。処理的にもっと手前の段階で計算をスキップするような処理を入れるべきなのかもしれなかったのだが、影響範囲が読めなくなってしまうので今回はやらなかった。

性能改善のための修正は宝探しをやっているようで、見つけるまではつらいが、探し当てるとすごく嬉しい。有名なOSSにも僕のような者が見つけられるような宝がまだ眠っているということが分かった。そうはいってもそれなりにチューニングされているので、もう本当にちょっとずつ削りだすような感覚でやっていかなければならない。