Futterステップアップによる動画効果の実現(六)
前の記事では、以前のBarChart.lerpの定義は効率的ではありませんでした。私たちが作成しているBarの例は、Bar.lerpのパラメータとしてのみ与えられ、アニメーションパラメータtの各値に対して繰り返し現れます。毎秒60フレームとは、比較的短いアニメーションであっても、多くのBarインスタンスがゴミ収集器に送られることを意味する。
以下の3つの解決策を採用できます。 Barの例は、collappsedを呼び出すたびに一回だけBarクラスで作成することによって繰り返し使用することができますが、この方法は私たちのアプリケーションに適合していません。 再利用は、BarChartweenによって処理され、その構造関数にリストを作成することによって、tweenのBarTweenの例は、補間棒グラフを作成する際に(i)=>_を使用する。tweens[i].lerp(t)この方法は静止法lerpを使用する慣例を壊しており、静的なBarChart.lerpでは、アニメーションの継続時間内に補間リストを記憶するためのオブジェクトは一切関与していない。逆に、BarChartweenオブジェクトはこの点にぴったりです。 は、Bar.lerpに適切な条件論理があると仮定し、nullを使用して折りたたみバーを表現することができ、この方法は非常に効率的であるが、nullを参照または誤解しないように注意する必要がある。nullは、Futter SDKで一般的に用いられており、静的方法lerpは、nullをアニメーションの終点として扱い、通常は、完全に透明な色またはゼロサイズのグラフィック要素のような、ある不可視要素として解釈される。私達のコードの中で、lerpDoubleはnullを0と見なして、2つのアニメーションの終わる点がすべてnullでない限り。 総合的に考えて、最後の解決策を使って、まずBarChartの部分コードを更新したいです。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
以下の3つの解決策を採用できます。
class BarChart {
// ...
static BarChart lerp(BarChart begin, BarChart end, double t) {
final barCount = max(begin.bars.length, end.bars.length);
final bars = new List.generate(
barCount,
(i) => Bar.lerp(begin._barOrNull(i), end._barOrNull(i), t)
);
return new BarChart(bars);
}
// ...
}
そして、Barの条件ロジックを更新したいです。
class Bar {
Bar(this.x, this.width, this.height, this.color);
final double x;
final double width;
final double height;
final Color color;
static Bar lerp(Bar begin, Bar end, double t) {
if(begin == null && end == null)
return null;
return new Bar(
lerpDouble((begin??end).x, (end??begin).x, t),
// ?: null
lerpDouble(begin?.width, end?.width, t),
lerpDouble(begin?.height, end?.height, t),
Color.lerp((begin??end).color, (end??begin).color, t)
);
}
}
今の私たちのアプリケーションでは、折りたたみストリップをどのように非可視要素として使うかを判断し、Bar.lerpの条件論理に書いて、私たちが望む高効率を実現します。見方を変えれば、皆さんが発見されたかどうかは分かりませんが、現在のコードのメンテナンス性は前のバージョンに及ばないです。これはなぜ前に効率が低く見える解決策を選んだのですか?性能とメンテナンス性の間で選択するには、測定してから決定する必要があります。以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。