2019-02-22に更新

TextMeshProGUIを動かした時、どの方法が一番負荷を下げられるのか試してみた

Unityのバージョン:2018.3.5f1

はじめに

アクションやRPGゲームでよく、敵からダメージを受けたときに頭上からダメージ数字がポーンと飛び出る演出がありますよね。
あれを作ろうとしたんですけど、どう作るか悩んで手が止まりました。
というのも、最近こういう記事を見たからです。

uGUI(Image)とSpriteRendererの静止時と動作時の負荷比較【Unity】【uGUI】【最適化】

uGUIを1つでも動かすと負荷が上昇するらしいです。

では、Canvas上の全てのTextが動く場合は、1つにまとめたほうがいいのか個別にしたほうがいいのか。
個別に動かす場合、Textを動かす場合とCanvasを動かす場合で負荷は変わるのか。
分からないので実際動かしてみました。

比較内容

今回、以下の4つのパターンをそれぞれ100個、500個、1000個同時に表示してアニメーションさせた場合の平均FPSを比較しました。


①1つのCanvasに全てのTextを表示+Textをアニメーションさせる

comp1.PNG
Scene上の「WorldCanvas」の下に「Text1」オブジェクトを生成します。
Animatorで「Text1」をアニメーションさせます。

②1つのCanvasに1つのTextを表示+Textをアニメーションさせる

comp2.PNG
Scene上に「Text2」オブジェクトを生成します。
Animatorで「Text2/Canvas/Text」をアニメーションさせます。

③1つのCanvasに1つのTextを表示+Canvasをアニメーションさせる

comp3.PNG
Scene上に「Text3」オブジェクトを生成します。
Animatorで「Text3/Canvas」をアニメーションさせます。

④1つのCanvasに1つのTextを表示+親オブジェクトをアニメーションさせる

comp4.PNG
Scene上に「Text4」オブジェクトを生成します。
Animatorで「Text4」をアニメーションさせます。


また、共通条件は以下の通りです。

  • アニメーションはAnimatorで実装(最初はDoTweenでアニメーションさせようとしたのですが、同時に動かせる数に制限があったのでAnimatorに変更)
  • 実行から5秒後に計測開始
  • 10秒間計測したときの平均FPSを計算

比較結果

Canvas1つ+Text移動 Canvas個別+Text移動 Canvas個別+Canvas移動 Canvas個別+オブジェクト移動
100 60.4 60.4 60.3 60.4
500 60.4 43.3 59.1 59.4
1000 49.7 32.7 30.3 32.5

結果を見る限り、1つのCanvasに全てのTextを表示するのが1番早かったです。
ただ、500個動かしたときと1000個動かしたときの結果について、2番以下の結果が異なっているのが少し気になります。

とりあえず、最初に参照した記事と合わせると、動くものは動くもの、動かないものは動かないもので1つにまとめるのが良いということでしょうかね。


長野別荘

福岡の片隅で友人と何か作ってます。 Steamでマッチ3パズルゲーム「TAVERN GUARDIANS: BANQUET」配信中。

Crieitはβバージョンで開発中です。進捗は公式Twitterアカウントをフォローして確認してください。 興味がある方は是非記事の投稿もお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

関連記事

コメント