Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Flutter 棒グラフの実装から学ぶ Container と Canvas の使い分け

Avatar for Yoko Yoko
August 07, 2022

Flutter 棒グラフの実装から学ぶ Container と Canvas の使い分け

Flutter × Kotlin Multiplatform by CyberAgent #7
https://cyberagent.connpass.com/event/254315

での登壇資料です。

Avatar for Yoko

Yoko

August 07, 2022
Tweet

More Decks by Yoko

Other Decks in Programming

Transcript

  1. 自己紹介 - 横井 一樹(Kazuki Yokoi) - Y! から CA -

    Flutter で WINTICKET - Vim にどハマり
  2. 自己紹介 - 横井 一樹(Kazuki Yokoi) - Y! から CA -

    Flutter で WINTICKET - Vim にどハマり WINTICKET は Flutter エンジニアが 8人在籍しているが、4人が vimmer
  3. アジェンダ 1. Container と Canvas の実装の比較 2. 棒グラフの仕様 3. 棒グラフの実装

    4. 両者の棒グラフのパフォーマンス比較 5. パフォーマンスの差の要因分析 6. セマンティクス 7. まとめ 8. Canvas の使用が求められる要件
  4. Container の実装 - 「 Hello 」という文字列を - 「白色」で - 「左右に

    16 の padding 」をつけて - 「赤色の背景色」の上に 表示させるように次のような パラメータを指定
  5. Container の実装 - 「 Hello 」という文字列を - 「白色」で - 「左右に

    16 の padding 」をつけて - 「赤色の背景色」の上に 表示させるように次のような パラメータを指定
  6. Canvas の実装 Flutter で Canvas を扱うためには、 CustomPaint と呼ばれる Widget を使用し

    ます。 例として、先ほど Container を使って書いた 図形を Canvas で描画するには
  7. 検証のために用いる棒グラフの仕様 Y 軸 - 棒グラフの高さを表す - 5 分割で表示する - 最大値は

    300 とする X 軸 - 何番目の棒グラフかを表す - 5 分割で表示する - 最大値は引数で与えられる
  8. 検証のために用いる棒グラフの仕様 棒グラフ - 与えられた色と高さを元に描 画する - フェードインしながら、その高 さまで伸びるアニメーションを 行う X

    軸 - 何番目の棒グラフかを表す - 5 分割で表示する - 最大値は引数で与えられる Y 軸 - 棒グラフの高さを表す - 5 分割で表示する - 最大値は 300 とする
  9. 棒グラフのレイアウト構成 X 軸 と Y 軸 と 棒グラフ のパーツを 図のように、Stackで配置

    (シンプル〜) ※この方法が最適ということではないので、  あくまで一例として見て頂けると 🙏
  10. Container を使った棒グラフの実装 ポイント 棒グラフの高さを伸ばすアニメーション箇所は、それぞれの 棒グラフの高さに応じて進捗を変える計算式 height: item.height * animationHeight.value /

    maxBarHeight, ↑のコードを日本語に要約すると ↓ 棒グラフの高さ = 指定された高さ × 高さの現在のアニメーション値 / 高さの最大のアニメーション値
  11. 検証結果 Container Canvas Devtools を使用して 5000 個描画した際の UI スレッドの負荷 -

    Container の平均値は 156.7ms - Canvas の平均値は 29.2ms 平均値 = 1 フレームにかかる描画時間の平均
  12. 検証結果 Container Canvas - Container の平均値は 156.7ms - Canvas の平均値は

    29.2ms 5 倍以上の差があることから、 Canvas の方が棒グラフの数を増やしても 安定したパフォーマンスを誇っている ことが分かった Devtools を使用して 5000 個描画した際の UI スレッドの負荷