読者です 読者をやめる 読者になる 読者になる

Android5系の一部端末でアニメーションがカクつくのを修正した

ARROWS NX/XperiaZ3/XperiaZ4辺りのAndroid5系端末でアニメーションがガクガクになっていたのを修正した。 Nexus5ではそこまでカクついたりはしていなかった。

問題箇所

問題箇所は以下が主な原因だった。

  • 余分なViewGroupなどレイアウトxmlの階層構造の深さ
  • android:clipChildren="false"
  • android:clipToPadding="false"

やっていたアニメーション

細かくは話せないがそこそこ複雑なViewで以下のようなアニメーションを同時に行っていた。

  • 背景の大きい画像をフェードアウト
  • CardViewをフェードしつつ45度回転しつつ画面外に移動させて見えなくする
  • CardView内の内容を更新
  • 背景の大きい画像を更新
  • CardViewをフェードしつつ45度回転しつつ画面内に登場させる
  • 背景の大きい画像をフェードイン

FPSを計測する

Taktを利用した。

github.com

FPSは通常30〜50 アニメーションする際に15まで落ちる感じ。 修正後は40〜50FPSで安定するようになった。

感想

  • 調査段階ではこの辺を読んで、アニメーションとViewの更新処理をより厳密に分けようとOnGlobalLayoutListenerを使ってみたりしたけどあまり効果はなかった。
  • 余分なViewGroupが多かったので、よりフラットな構造にしたら目に見えて改善したので驚いた。
  • clipChildren/clipToPaddingも変更しただけで目に見えて改善した。onLayoutなど描画イベントの波及を増やしてしまうんだろうか?マイナスマージンは避けようと思った。