こんばんわです
季節がらまたも台風が 西日本方面からちかづいているとか
今年は大きめの 『大自然のおしおき』 が押しよせているようですが
被害が出ないよう気を引き締めないといけませんね
そんな業務連絡
さて ようやくお仕事のほう一段落しましたが まだ膝に受けた傷が癒えておりません
長いこと記事も更新していないため かるく翻訳ネタでリハビリをしようと思います。
今回はUnite2013のUnityのモバイルゲームの最適化に関するペーパーを PDFのリンクだけだとさみしいので簡単に訳してみました
情報としてはちょっと古めかもしれませんが、これからUnityでゲーム制作を初める方は参考にどうぞ。
||||||||||||||||||||||||||||||||||||||||||||||||||
□Optimizing Unity Games for Mobile Platforms
|
Angelo Theodorou
Software Engineer
Unite 2013, 28th-30th August
malideveloper.arm.com-downloads-Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms.pdf
||||||||||||||||||||||||||||||||||||
□Mali_GPUについて
□予備知識
■ドローコールとは何ですか?
- 基本となるAPI(例えばOpenGL ESの)の関数を呼び出すと、画面上に何かを描画することです
■フラグメントとは何ですか?
- 一度描画候補に上がったピクセルは表示されてもされなくても(例えば、上書きされる 廃棄されるなど)スクリーン全体に描画されます
■不透明と透明レンダリングキューの違いは何ですか?
- 最初のキューではオブジェクトはデプステストにしたがって手前から奥に向かって最小限のオーバードローでレンダリングされます
透明なものはその後に正確さを維持しつつ奥から手前に向かってレンダリングされます
■バッチ処理とは何を意味するのでしょうか?
- 全体のデータセットの中から似たようなインスタンスグループを1回のドローコールで呼び出しするための処理です
■なぜモバイルプラットフォームは異なっているのですか?
- 即時レンダリング(フォワードレンダリング)と遅延レンダリング(ディファードレンダリング)の差です
□なぜモバイルプラットフォームが異なっているのでしょう?
■デスクトッププラットフォーム
- 即時モード:グラフィックスコマンドがすぐに実行される
- GPUと専用ビデオメモリ(> 100 GB /秒)の間で利用可能な帯域幅で膨大な量のデータ転送ができる 電力消費や発熱に厳しい制限がない
■モバイルプラットフォーム
- 遅延モード:グラフィックスコマンドはドライバによって収集された後で実行される
- タイルベース:メモリに書き込まれる前に、小さなオンチップバッファでレンダリングされる
- 帯域幅が大幅に減少し(?5GB /秒)データ転送に大きなパワーを必要とする
- メモリが統一され、CPUとGPUの間で共有されている
□ユニティプロ
■プロバージョンのみの最適化機能:
- Profiler (プロファイラ )
- Level of Detail ( LOD)
- Occlusion Culling (オクルージョンカリング)
- Light Probes (ライトプローブ)
- Static Batching (静的バッチ処理)
□OpenGL ES3.0
■Unity4.2、Androidの4.3と Mali-T6xxで利用可能
■変換フィードバック
- データ再利用のためのバッファオブジェクトに頂点シェーダー出力を書き込むことができる
■ETC2とEACテクスチャ圧縮フォーマット
- RGBAのためのサポート(ETC2)および1/2チャンネルのテクスチャ(EAC)
■オクルージョンクエリ
- 可視性を決定するために描かれたサンプルの数を照会できる
オクルージョンクエリとは: http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter06.html
■ジオメトリインスタンシング
- 同じオブジェクトで独自プロパティを持つ多量のインスタンス
■Primitive restart, Uniform Buffer Objects, Pixel Buffer Objects,
Fences, FP/3D/depth textures, Multiple Render Targets, …
□ボトルネックを特定する
■CPU
- ドローコール(描画呼び出し)が多すぎる
- 複雑なスクリプトや物理演算
■頂点処理
- 頂点数が多すぎる
- 頂点ごとの計算が多すぎる
■フラグメント処理
- 多すぎるフラグメント処理は、オーバードローにつながる
- フラグメントごとの多すぎる計算
■帯域幅
- 解像度が大きく非圧縮なテクスチャ
- 高解像度なフレームバッファ
□CPU バウンド
■ドローコール(描画呼び出し)が多すぎる
- 静的バッチ(Unityプロのみ)
- ダイナミックバッチ処理(自動)
- 錐台カリング(自動)
- オクルージョンカリング(Unityプロのみ)
■複雑なスクリプト
- コンポーネントのキャッシング
- オブジェクトのプール
- GUIコールの削減
- OnBecomeVisible()/ OnBecomeInvisible()
- 時間指定ではなく、フレームごと更新のコルーチン
■複雑な物理計算
- 一つのメッシュコライダの代わりに複数のコライダーを組み合わせる
- “Fixed Timestep”の時間間隔を増加(TimeManager)
□ 頂点バウンド
■頂点数の多すぎるジオメトリ
- 不要な頂点を削除する
- 不要なハードエッジとUVシームを削除する
- LODを利用するLODGroupで切り替え(Unityプロのみ)
- カリング錐台(自動)
- オクルージョンカリング(Unityプロのみ)
■頂点ごとの計算が多すぎる
- Unityシェーダのモバイル版を使用
□頂点バウンド LOD
■LODグループを使用することでオブジェクト細部を必要としない時に頂点数を制限することが出来ます(オブジェクトが非常に遠くにあったり 小さかったりする場合)
- ジオメトリオブジェクトが非常に遠くに表示される場合はビルボード(板ポリゴン)で置き換えることが出来ます
□フラグメントバウンド
■オーバードロー
- スクリーンに描画するとき おなじピクセルに何回も書き込みしない
- オブジェクトを手前から奥に向かって描画するより奥から手前に向かって描画するほうがオーバードローは少ない、デプステストがもたらす恩恵
- シーン内でのトランスペアレンシー(透過)の量を制限します(パーティクルに注意しましょう)
- Unityには、ピクセルあたりのオーバードローの量を表示するためにレンダリングモードがある
■多すぎるフラグメント(ピクセル描画)計算
- データを出来る限りベイクする(ライトマップ、ライトプローブなど)
- ピクセル単位のライトの数が含まれている
- リアルタイムの影を制限(ハイエンドのモバイルデバイスのみ、Unity4プロ)
- フルスクリーンのポストプロセッシングを避けるようにする
- Unityシェーダのモバイル版を使用
□フラグメントバウンド - オーバードロー
■レンダリングモードを使用してオーバードローの量を確認する
□帯域幅バウンド
■テクスチャ圧縮の使用
- OpenGL ES3.0とOpenGL ES2.0、ETC2、EACと、ETC1
- ASTCはまもなくUnityでサポートされる新しいクロノス規格です
■MIPマップの利用
- 多くのメモリが必要だが画質は向上(より少ないエイリアシングアーティファクト)
- メモリ帯域幅の最適化(小さいマップからサンプリングしたとき)
■ディテールの減少にも対応できる16ビットテクスチャの使用
■トライリニアフィルタと異方性フィルタリング の適切な使用
□帯域幅バウンド - ミップマップ
■レンダリングモードを使用してミップマップ・レベルをチェックします
||||||||||||||||
プロファイリングツール
□ユニティ・プロファイラー
■詳細なフレーム単位のパフォーマンスデータを提供します
■プロファイラーは次の特定のデータを提供します
- CPU使用率
- レンダリング
- GPUの使用方法
- メモリ
- 物理計算
- オーディオ
■モバイルデバイス上のコンテンツの実行をプロファイルすることができます
■Unityプロでのみ使用可能
□ユニティプロファイラ - CPU使用率
■これはレンダリング、スクリプト、物理演算、ガベージコレクションなど におけるCPU使用率を示しています
■どのように時間消費されたかについての詳細な情報を示しています
■スクリプトで発生したすべての関数コールに対しディーププロファイルのデータを追加し有効にすることができます
■Profiler.BeginSample()とProfiler.EndSample()で特定ブロックにコードを記述することでマニュアルで追跡が可能になります
□ユニティプロファイラ レンダリング
■レンダリングサブシステムに関する統計
- ドローコール
- 三角メッシュ
- 頂点
- ■下部ペインのエディタウィンドウは、レンダリングの統計と同様のデータを示している
□ユニティプロファイラ メモリ
■使用/確保 されたメモリをより高いレベルで閲覧できます
- Unityのネイティブの割り当て
- ガベージコレクトされたMonoが管理する割り当て
- グラフィックスとオーディオの合計使用されるメモリの推定
- プロファイラ・データ自身の使用メモリ
■アセット/オブジェクトが使用するメモリも参照できます
- テクスチャ
- メッシュ
- マテリアル
- アニメーションクリップ
- オーディオクリップ
■ユニティ4.1以降の 新しい詳細な内訳
□ユニティプロファイラ - GPUの使用方法
■CPUのプロファイラと同様の内訳を示しています
- 不透明なオブジェクトのレンダリング
- 透明なオブジェクトのレンダリング
- 影
- ディファードシェーディングパス
- ポストプロセッシング
※モバイル・プラットフォーム上ではまだ利用できません
□ARM Streamlineのパフォーマンスアナライザ
□サンプルアプリケーションの概要
■7種類のシーンで構成
- ジオメトリ(高い頂点数、錐台カリング)
- LOD(LODGroupを通じてLODレベルを使用)
- パーティクル(透明レンダリング)
- テクスチャ(ミップマッピングと圧縮)
- オーバードロー(アルファブレンディングとアルファテスト)
- ライト(頂点およびピクセルライティング)
- アトラス(テクスチャアトラス)
■それらのほとんどはプレハブとInstantiate()に基づいています
- すべてのインスタンスが最初に一度に作成され、ディアクテイブされる
- アクティブなインスタンスの数は、目標のFPS値を維持するために適応することができる
- 位置決めは、スクリーン空間で行われカメラのアスペクト比に基づいている
□ジオメトリシーン
■高い頂点数のポリゴンオブジェクトがたくさん頂点単位を強調
- 可視オブジェクトの量または目標のFPS値を設定することができます
- レンダリングに多くの時間が費やされている(緑で描画の部分)
- 表示オブジェクトの数が増えた部分
■カメラを回転し移動することでカリング錐台の動作状態を確認できる(オクルージョンカリングが働いていない)
- ほとんどのオブジェクトはカメラビューの外に存在して錐台カリングの効果が出ている
- オブジェクトのほとんどは手前のオブジェクトに隠れているが(処理負荷が上がっている)オクルージョンカリングが有効になっていない
□LODシーン
■3つの異なるレベルのLODGroup
■三角メッシュと頂点がLODレベルで切り替えられ、ドローコールが錐台カリングに影響を受けている
□パーティクルシーン
■すべてのレンダリングは、「透明キュー」で行われます
■完全なジオメトリバッチがなされている場合(パーティクルエミッタごとに1回のドローコール)
□テクスチャシーン
■MIPマップを使用した圧縮テクスチャ(右)はメモリ消費が少なく 圧縮されていないもの(左)より良く見える
右:様々な形式で圧縮+トライリニアフィルタリング+MIPマップ
左:非圧縮+バイリニアフィルタリング
□オーバードローシーン
■アルファブレンドされた四角メッシュが透明キューにレンダリングされ オペーク(不透明)キュー内でアルファテストが実行される、両方同じパフォーマンス
□ライトシーン
■ピクセル単位のライティングがライトごとにドローコールされる(フォワードレンダリング)
■頂点ごとのライティングはオブジェクト単位のジオメトリパスで実行される ライティング情報は頂点の属性
■MeshRenderer.Renderは、ms(ミリ秒)あたり5倍のピクセル単位のライティングを実行する(ライトごとに1つのパス)
□アトラスシーン
■非テクスチャアトラスのレンダリング
- 各インスタンスは、独自にテクスチャを持っている
- 同じ材料の複数のインスタンスが同じテクスチャを共有する場合
- マテリアルごとに一度のドローコール(複数のインスタンスの場合)
■アトラスレンダリングでマテリアルUVを変更
- 各インスタンスは、同じテクスチャアトラスを共有
- UV座標はmainTextureScaleとmainTextureOffsetを使用して変更される
- 独自のマテリアルがインスタンスに割り付けられるとインスタンス描画の関係は崩れる
- インスタンスごとに1つのドローコール
■アトラスレンダリングでメッシュのUVを変更
- 各インスタンスは、同じテクスチャアトラスを共有
- UV座標は、インスタンスのメッシュにアクセスして変更されます
- 一度のドローコールですべてのインスタンスを描画(マテリアルは一つだけ)
左から
:アトラスなしテクスチャ
60 FPS
50 draw calls, 374 batched
21 materials
:アトラスとマテリアルUV
40 FPS
408 draw calls, 0 batched
395 materials
マテリアルにバッチが働いていない
:アトラスとメッシュUV
60 FPS
35 draw calls, 374 batched
21 materials
マテリアルにバッチが効いていて、ドローコールが少ない
:参照リンク
Practical Guide to Optimization for Mobiles (Unity Manual)
Optimizing Graphics Performance (Unity Manual)
Profiler (Unity Manual)
ShadowGun: Optimizing for Mobile Sample Level (Unity Blog)
“Fast Mobile Shaders” talk at SIGGRAPH 2011 (Unity Blog)
Introducing the new Memory Profiler (Unity Blog)
Unity 4.2 has arrived (Unity Blog)
http://malideveloper.arm.com/
OpenGL ES 3.0 Developer Resources (Mali Developer Center)
ASTC Texture Compression: ARM Pushes the Envelope in Graphics Technology (ARM Blogs)
【編集後記】
ということで久しぶりにブログ更新すると 疲れました えらく疲れました
次回は前回予告したとおりスクリーンスペース系のイメージエフェクト解説をする予定なのですが
久しぶりに以前書いたコードを見なおしたら キタナクて解説とか出来なそうなのでいまリライトしている最中です
なので気長に一週間ほど待っていただきたい ほんものの(ry
いまのところ予定では 次の2種類のエフェクトから徐々に進めていくつもりです
■SSDO (Screen Space Directional Occlusion)
スクリーンスペースベースの リアルタイムグローバルイルミネーション
■SSLR (Screen Space Local Reflections)
スクリーンスペースベースの リアルタイム反射モデル
この画像のモデルの配置がカオスなところが現在の心境を表しているような気が(´・ω・`)
ということで
「この次はモアベターよ」
こういうネタが通じる年代が見に来ているのか疑問だけれど(小森のおばちゃんネタではないです)























