0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ひとりアドベントカレンダーAdvent Calendar 2024

Day 21

【UIToolkit】ドローコールのバッチ最適化

Posted at

UIToolkitのパフォーマンスについての公演が日本語翻訳されていました
その内容からの抜粋です

概要

ドローコールとは「グラフィックスAPIを通して、画面への描画内容を指示すること」を指します

ドローコールはグラフィックス API に対して、何をどのように描画するかを指示します。各ドローコールには、テクスチャ、シェーダー、バッファに関する情報など、グラフィックス API が画面に描画するために必要なすべての情報が含まれています。

また、ドローコールの数がパフォーマンスに直結します

描画コマンドの処理は、DrawCall を一つの基準としてドライバが処理するため、DrawCall の増加が > CPU の負荷となります。

  • コマンドバッファの蓄積
  • コマンドバッファ(レンダーステート)の正当性のチェック
  • ネイティブな描画命令への変換
  • GPU への転送

そのため、ドローコールを減らすことはゲーム全体で意識することが必要です

UnityではFrame Debuggerというツールで、各ドローコールの詳細を確認することができます
複数の描画要素を一つのドローコールにまとめるバッチ処理がどのように行われているかも確認できます

Unity6ではGameパネルに虫さんマークが追加されており、これを押すことで簡単にFrame Debuggerを開くことができます

スクリーンショット 2024-12-22 21.07.27.png

この記事では、UIToolkitにおけるドローコール削減テクニックについて解説します

頂点バッファによるBatching

UIToolkitでは、内部で頂点バッファを持っています
頂点バッファはパネルが作られる際にメモリが確保され、そればいっぱいになると新しい頂点バッファが作られます

頂点バッファごとにドローコールが作成されるため、頂点バッファを大きくすることでドローコールを抑えられることができます


こんなUIを用意してみました
スクリーンショット 2024-12-22 21.34.52.png

8この要素が並んでいます
スクリーンショット 2024-12-22 21.38.32.png
全て同じテクスチャを使っており、1つのドローコールにまとめられています

ここで男の子をいっぱい増やしてみます
スクリーンショット 2024-12-22 21.33.16.png

なんとドローコールが2つに分かれています
7GkfclLXHCyxZPM8NT2i1734871613-1734871620.gif

これは大量の画像によって頂点バッファが2つに分けられてしまったために、ドローコールがわけれられてしまっているのです

ここで頂点バッファの大きさを大きくしてみます

スクリーンショット 2024-12-22 21.51.53.png

頂点数を15000まで増やしてみました

スクリーンショット 2024-12-22 21.52.38.png
すると1つのドローコールにまとまります

頂点バッファが溢れなくなったことで、バッチングされるようになりました

このサンプルでは746個の要素が配置されており、ちょうど分けられなくなる頂点バッファサイズは8952でした
1要素ごとの正確な頂点はドキュメントを見つけられませんでしたが、ちょうど12倍なことから、矩形でも12頂点を使ってしまうようです

バッファサイズはメモリ確保量と直結するため、プロジェクト全体で確保しないよう気をつけてください

テクスチャ周りのBatching

UIToolkitではテスクチャの違いによってドローコールが分かれないよう、様々な工夫がされています

こんなUIを用意しました
8種類のスプライトが順番に配置されています
スクリーンショット 2024-12-22 22.19.50.png

これはドローコールが1つにまとめられますZ7z4WWrnImyeYLLKE8Iy1734873831-1734873878.gif

スクリーンショット 2024-12-22 22.20.56.png

UIToolkit使われているシェーダーでは8個までのテクスチャを受け付けていて、その範囲内であればドローコールがまとめられるようになっています
スクリーンショット 2024-12-22 22.21.18.png

そのため、9種類以上になると...
スクリーンショット 2024-12-22 22.22.19.png

大量のドローコールに分けられてしまいます

Z7z4WWrnImyeYLLKE8Iy1734873831-1734873878.gif

これは9種類目に追加されたテクスチャによって、1ドローコールで処理できなくなったことにより分けられてしまっています

ここでPanesSettingsでDynamic Atlasの設定をします
スクリーンショット 2024-12-22 22.27.16.png

すると1つのドローコールにまとめられます
スクリーンショット 2024-12-22 22.28.10.png

ダイナミックアトラスによって、複数のテクスチャが1つのテクスチャにまとめられることで、テクスチャ枠を節約できているんですね
スクリーンショット 2024-12-22 22.28.27.png

このように大量のテクスチャが設定される場面では、適切にアトラスを設定する必要があります
ここでは動的アトラスを使いましたが、通常のアトラスも対応しているのでそちらも検討してみてください

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?