2014年08月

2014年08月21日

「なつまち」





それは先週のこと 仕事が一段落したので はやりのUnrealEngine4でも起動してみるか なんていう気を起こしたのがまずかった 
ディスプレイドライバがとんで画面が真っ黒 グラボのスペックたりなかったのかもしれない
というか明らかにそれなんでしょうけど その後も起動するたびにフリーズ PCもなんか調子悪い
ドライバも最新版にしたんだけど どこか他のところもおかしくなってしまったらしい 
仕事がつまっているので調べている時間がないし 治ってもUE4は起動できなそうなので  (いまのはノートだからパーツ交換無理 
3年半ぶりにニューPCを購入した次第。  

PCがお昼すぎ(2時くらいかな にとどくまで待ってるあいだ 手持ちブタさんなので日記を書いて気を紛らす そんな夏の日なのです。

UnrealEngine3は動いていたんだけどなUE4重たいのね (´・ω・`)





にゅうPCの環境が整うまでコーナーはおやすみして しばらく日記で更新はつづくと思います




●なんか 絵づらがさみしいので柑菜ちゃんおいときますね

anonatsu-tan-b2











akinow at 11:45|PermalinkComments(6)TrackBack(0) Clip to Evernote 日記 

2014年08月08日

うにばな 講座みたいなもの番外編(高速化(最適化)について3 モバイル系-翻訳)

 

 

 

こんばんわです

 

季節がらまたも台風が 西日本方面からちかづいているとか

今年は大きめの 『大自然のおしおき』 が押しよせているようですが

被害が出ないよう気を引き締めないといけませんね

 

そんな業務連絡

 

 

 

さて ようやくお仕事のほう一段落しましたが まだ膝に受けた傷が癒えておりません

長いこと記事も更新していないため かるく翻訳ネタでリハビリをしようと思います。

 

今回は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について

 

Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_06

 

 

 


□予備知識


ドローコールとは何ですか?

  • 基本となる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, …

 
 

 


ボトルネックを特定する

 

Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_12


CPU

  • ドローコール(描画呼び出し)が多すぎる
  • 複雑なスクリプトや物理演算

頂点処理

  • 頂点数が多すぎる 
  • 頂点ごとの計算が多すぎる


フラグメント処理

  • 多すぎるフラグメント処理は、オーバードローにつながる
  • フラグメントごとの多すぎる計算

■帯域幅

  • 解像度が大きく非圧縮なテクスチャ
  • 高解像度なフレームバッファ


  
□CPU バウンド


ドローコール(描画呼び出し)が多すぎる

  • 静的バッチ(Unityプロのみ)
  • ダイナミックバッチ処理(自動)
  • 錐台カリング(自動)
  • オクルージョンカリング(Unityプロのみ)


複雑なスクリプト

  • コンポーネントのキャッシング
  • オブジェクトのプール
  • GUIコールの削減
  • OnBecomeVisible()/ OnBecomeInvisible()
  • 時間指定ではなく、フレームごと更新のコルーチン

複雑な物理計算

  • 一つのメッシュコライダの代わりに複数のコライダーを組み合わせる
  • “Fixed Timestep”の時間間隔を増加(TimeManager)



頂点バウンド


■頂点数の多すぎるジオメトリ

  • 不要な頂点を削除する
  • 不要なハードエッジとUVシームを削除する
  • LODを利用するLODGroupで切り替え(Unityプロのみ)
  • カリング錐台(自動)
  • オクルージョンカリング(Unityプロのみ) 
     

頂点ごとの計算が多すぎる

  • Unityシェーダのモバイル版を使用


  
頂点バウンド LOD

Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_15


■LODグループを使用することでオブジェクト細部を必要としない時に頂点数を制限することが出来ます(オブジェクトが非常に遠くにあったり 小さかったりする場合)

  • ジオメトリオブジェクトが非常に遠くに表示される場合はビルボード(板ポリゴン)で置き換えることが出来ます

 


フラグメントバウンド


■オーバードロー

  • スクリーンに描画するとき おなじピクセルに何回も書き込みしない
  • オブジェクトを手前から奥に向かって描画するより奥から手前に向かって描画するほうがオーバードローは少ない、デプステストがもたらす恩恵
  • シーン内でのトランスペアレンシー(透過)の量を制限します(パーティクルに注意しましょう)
  • Unityには、ピクセルあたりのオーバードローの量を表示するためにレンダリングモードがある

 

■多すぎるフラグメント(ピクセル描画)計算

  • データを出来る限りベイクする(ライトマップ、ライトプローブなど)
  • ピクセル単位のライトの数が含まれている
  • リアルタイムの影を制限(ハイエンドのモバイルデバイスのみ、Unity4プロ)
  • フルスクリーンのポストプロセッシングを避けるようにする
  • Unityシェーダのモバイル版を使用

 

 

フラグメントバウンド - オーバードロー


■レンダリングモードを使用してオーバードローの量を確認する

 

Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_17

 


  

 

帯域幅バウンド

  ■テクスチャ圧縮の使用

  • OpenGL ES3.0とOpenGL ES2.0、ETC2、EACと、ETC1
  • ASTCはまもなくUnityでサポートされる新しいクロノス規格です

   ■MIPマップの利用

  • 多くのメモリが必要だが画質は向上(より少ないエイリアシングアーティファクト)
  • メモリ帯域幅の最適化(小さいマップからサンプリングしたとき)

   ■ディテールの減少にも対応できる16ビットテクスチャの使用

   ■トライリニアフィルタと異方性フィルタリング の適切な使用 

Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_18

 

 

 


帯域幅バウンド - ミップマップ

レンダリングモードを使用してミップマップ・レベルをチェックします

 

Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_19


 

 

 

 

 




プロファイリングツール

ユニティ・プロファイラー


詳細なフレーム単位のパフォーマンスデータを提供します


プロファイラーは次の特定のデータを提供します

  • CPU使用率
  • レンダリング
  • GPUの使用方法
  • メモリ
  • 物理計算
  • オーディオ

モバイルデバイス上のコンテンツの実行をプロファイルすることができます

   ■Unityプロでのみ使用可能 


Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_21

 

 

 

 

ユニティプロファイラ - CPU使用率


これはレンダリング、スクリプト、物理演算、ガベージコレクションなど におけるCPU使用率を示しています
どのように時間消費されたかについての詳細な情報を示しています
スクリプトで発生したすべての関数コールに対しディーププロファイルのデータを追加し有効にすることができます
   ■Profiler.BeginSample()Profiler.EndSample()で特定ブロックにコードを記述することでマニュアルで追跡が可能になります


Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_22

 

  

 

ユニティプロファイラ レンダリング


    ■レンダリングサブシステムに関する統計

  • ドローコール
  • 三角メッシュ
  • 頂点
      下部ペインのエディタウィンドウは、レンダリングの統計と同様のデータを示している

    Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_23

     

     


      
    ユニティプロファイラ メモリ


    使用/確保 されたメモリをより高いレベルで閲覧できます

    • Unityのネイティブの割り当て
    • ガベージコレクトされたMonoが管理する割り当て
    • グラフィックスとオーディオの合計使用されるメモリの推定
    • プロファイラ・データ自身の使用メモリ

    アセット/オブジェクトが使用するメモリも参照できます

    • テクスチャ
    • メッシュ
    • マテリアル
    • アニメーションクリップ
    • オーディオクリップ 
       

    ユニティ4.1以降の 新しい詳細な内訳

     

    Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_24


      

    ユニティプロファイラ - GPUの使用方法


    CPUのプロファイラと同様の内訳を示しています

    • 不透明なオブジェクトのレンダリング
    • 透明なオブジェクトのレンダリング
    • ディファードシェーディングパス
    • ポストプロセッシング


    モバイル・プラットフォーム上ではまだ利用できません

     

     

    Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_25

     

     

    ARM Streamlineのパフォーマンスアナライザ

    Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_26

     

    □サンプルアプリケーションの概要

    7種類のシーンで構成

    • ジオメトリ(高い頂点数、錐台カリング)
    • LOD(LODGroupを通じてLODレベルを使用)
    • パーティクル(透明レンダリング)
    • テクスチャ(ミップマッピングと圧縮)
    • オーバードロー(アルファブレンディングとアルファテスト)
    • ライト(頂点およびピクセルライティング)
    • アトラス(テクスチャアトラス)

    それらのほとんどはプレハブとInstantiate()に基づいています 

    • すべてのインスタンスが最初に一度に作成され、ディアクテイブされる
    • アクティブなインスタンスの数は、目標のFPS値を維持するために適応することができる
    • 位置決めは、スクリーン空間で行われカメラのアスペクト比に基づいている

     

    ジオメトリシーン

    ■高い頂点数のポリゴンオブジェクトがたくさん頂点単位を強調

    • 可視オブジェクトの量または目標のFPS値を設定することができます

     

    • レンダリングに多くの時間が費やされている(緑で描画の部分)
    • 表示オブジェクトの数が増えた部分


      
    カメラを回転し移動することでカリング錐台の動作状態を確認できる(オクルージョンカリングが働いていない)

    • ほとんどのオブジェクトはカメラビューの外に存在して錐台カリングの効果が出ている
    • オブジェクトのほとんどは手前のオブジェクトに隠れているが(処理負荷が上がっている)オクルージョンカリングが有効になっていない
    Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_29

     

     

     
    LODシーン 

    3つの異なるレベルのLODGroup

    三角メッシュと頂点がLODレベルで切り替えられ、ドローコールが錐台カリングに影響を受けている


     Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_30 
     


    パーティクルシーン


    すべてのレンダリングは、「透明キュー」で行われます 
    完全なジオメトリバッチがなされている場合(パーティクルエミッタごとに1回のドローコール)


     Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_31 
      
      
      
     

     

    テクスチャシーン

    ■MIPマップを使用した圧縮テクスチャ(右)はメモリ消費が少なく 圧縮されていないもの(左)より良く見える

    右:様々な形式で圧縮+トライリニアフィルタリング+MIPマップ

    左:非圧縮+バイリニアフィルタリング

    Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_32

     

     

    オーバードローシーン

    ■アルファブレンドされた四角メッシュが透明キューにレンダリングされ オペーク(不透明)キュー内でアルファテストが実行される、両方同じパフォーマンス

     

    Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_33

     

     

    ライトシーン

    ピクセル単位のライティングがライトごとにドローコールされる(フォワードレンダリング) 

    頂点ごとのライティングはオブジェクト単位のジオメトリパスで実行される ライティング情報は頂点の属性

     

    Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_34

     

     

    MeshRenderer.Renderは、ms(ミリ秒)あたり5倍のピクセル単位のライティングを実行する(ライトごとに1つのパス)

     

     

    Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_35


    アトラスシーン

    ■非テクスチャアトラスのレンダリング

    • 各インスタンスは、独自にテクスチャを持っている
    • 同じ材料の複数のインスタンスが同じテクスチャを共有する場合
    • マテリアルごとに一度のドローコール(複数のインスタンスの場合)


    アトラスレンダリングでマテリアルUVを変更

    • 各インスタンスは、同じテクスチャアトラスを共有
    • UV座標はmainTextureScalemainTextureOffsetを使用して変更される
    • 独自のマテリアルがインスタンスに割り付けられるとインスタンス描画の関係は崩れる
    • インスタンスごとに1つのドローコール

     
    アトラスレンダリングでメッシュのUVを変更

    • 各インスタンスは、同じテクスチャアトラスを共有
    • UV座標は、インスタンスのメッシュにアクセスして変更されます
    • 一度のドローコールですべてのインスタンスを描画(マテリアルは一つだけ) 
        

       

    Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms_37

     

    左から

    :アトラスなしテクスチャ

    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)

    スクリーンスペースベースの リアルタイム反射モデル

     

     

     

    イメージエフェクト説

     

    この画像のモデルの配置がカオスなところが現在の心境を表しているような気が(´・ω・`)

     

     

     

    ということで

    「この次はモアベターよ」

    こういうネタが通じる年代が見に来ているのか疑問だけれど(小森のおばちゃんネタではないです)



    akinow at 17:50|PermalinkComments(0)TrackBack(0) Clip to Evernote Unity3d | シリーズ講座