トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

Unityパフォーマンス改善

VRのUnityプロジェクトが激重になったので、どうにかしたい。

プロファイラは見た。

bibinbaleo.hatenablog.com

次はパフォーマンス改善。最適化ともいうのかな?

いろいろツールやアプローチ方法はありそう。

初心者なので間違ってるところも多いと思います

参考

公式

docs.unity3d.com

ゲームを高速化する際のチェックリスト
 
  • PC 向けでは頂点数 20 万未満、フレーム毎では 300 万より少なくなるようにします(ターゲットとする GPU のスペックに依存します)。
  • ビルトインシェーダーを使用する場合、 Mobile または Unlit のカテゴリーから選択する。モバイルでないプラットフォームでも動作しますが、より複雑なシェーダーの簡素化され、近似化されたバージョンです。
  • シーンにおける異なるマテリアルの数を低く抑えます - 異なるオブジェクト間でマテリアルをできるかぎり共有します。
  • 動かないオブジェクトに対して、Static を設定して、ドローコールバッチング のような内部の最適化を許容します。
  • ジオメトリに影響する ピクセルライト (完璧にディレクショナルな) を複数でなく、 1つだけ設定するようにします。
  • 動的なライティングを使用するより、ライティングをベイクするようにします。
  • 圧縮テクスチャ形式を可能な場合は使用する、その他の場合は 32 ビットよりも 16 ビットを選択します。
  • 可能な限りフォグの使用を避けます。
  • 遮蔽物が沢山ある複雑で静的なシーンの場合には、オクルージョンカリング を使用して表示するジオメトリの量とドローコールを削減します。オクルージョンカリングを念頭に置きながら、レベルの設計をします。
  • Skybox を使用して遠くのジオメトリを “本物に見せかけます”。
  • ピクセルシェーダーを使用するか、Texture Combiner を使用して、マルチパスではなく複数のテクスチャをミックスします。
  • 可能な場合は、  精度浮動小数点数の変数を使用してください。
  • pow 、 sin 、 cos などの複雑な数値計算の使用を最小限に抑えます。

フラグメントごとのテクスチャを極力使用しないようにします。

 

この記事もめっちゃ神だった

qiita.com

vrcworld.wiki.fc2.com

note.com

framesynthesis.jp

tsubakit1.hateblo.jp

uGUIとかテクスチャ

uGUIとかテクスチャ周りは以前調べた。

bibinbaleo.hatenablog.com テクスチャやuGUI周りってどれぐらい影響出るんだろう?

まずは3Dのレンダリング周りをやったほうが結果出るかな。まあプロファイリングの結果次第か・・・

Statics

動かないものはStaticsにすると良い場合もある

f:id:bibinbaleo:20200911135259p:plain

静的バッチ処理はCPU上で頂点の変換を行わないため動的バッチ処理よりもCPUは低負荷だが、メモリを多く消費する。

qiita.com

 必ずしもいいわけではないのか

頂点数を落とす

最適化講座では、あまりここが問題になることはないって言ってた。

頂点数

モバイルで 10万以下、PC で数百万以下

~~

PC 向けでは頂点数 20 万未満、フレーム毎では 300 万より少なくなるようにします

グラフィックスパフォーマンスの最適化 - Unity マニュアル

OVRProfileには10万以下がイイって書いてた

 

Lighting

ベイクするなど

DirectionalLight1つしか使ってないプロジェクトでも考慮すべきことあるかな?

影とか??

オクルージョンカリング

カメラに写っていないオブジェクトは表示しないようにする処理

docs.unity3d.com

別記事で試した。

bibinbaleo.hatenablog.com

MeshBake

同じマテリアルのメッシュを一つに合体させるアセット

MeshBaker

kan-kikuchi.hatenablog.com

Mesh Combine Studio

www.asset-sale.net

無料アセットをこの記事で試した。Batchesが減る

bibinbaleo.hatenablog.com

LOD

遠くにいるときはローポリのオブジェクトに変化させるやつ。

でもローポリのオブジェクトを用意しないといけない。

nn-hokuson.hatenablog.com

スクリプト

debug.Log

debug.Logは重いって。でもビルドしたものには関係ない?

Editorで実行するときにかかわる。

techblog.kayac.com

製品化したときもログの文章自体は出る

qiita.com

PlayerSettingのLogをNonにしたらStackTraceはなくなるらしい

f:id:bibinbaleo:20200914160133p:plain

でもDebug文自体は出る。

 

文章を出さないようにするには

Debug.unityLogger.logEnabled = false;

をStartなどに書いたら出なくなった。

文字列操作

文字の足し算などの文字列操作はメモリを使用する。GarbageCollection(GC)が起きる。

StringBuilderを使う

bibinbaleo.hatenablog.com

float,half

floatの代わりにhalfという中精度の浮動小数点値を使うとモバイルGPUではパフォーマンスに影響することもあるらしい。

浮動小数点数の変数の精度 ( float 対 half 対 fixed ) が、 デスクトップ GPU ではほとんど無視される一方で、 モバイル GPU でよいパフォーマンスを得ることがかなり重要になっています。

~~

可能な場合は、 半 精度浮動小数点数の変数を使用してください。

グラフィックスパフォーマンスの最適化 - Unity マニュアル

詳しいこと

docs.unity3d.com

キャッシュ

Update中にgetComponentやFindせずに、なるべくStart()など最初にまとめて探しておく

Camera

CameraのClippingPlanesで無駄に遠くを描画しない。どれくらい効果があるのかは知らない。

f:id:bibinbaleo:20200915164731p:plain

RenderTexture?

CameraとRenderTextureで鏡的なことをやっているけど、そのCamera単体でBatches的が600~800あった。カメラ消したらBatcheの数が減る。

RenderTextureの解像度はかなり下げてるしこれ以上どうしたらいいんだろう・・・

なんかカメラの設定とかあるかな?

物理

MeshColliderでなくBoxColliderを使う

 

判定回数はProjectSettings>TimeでFixedTimestepで変更できる。30fpsなら0.033でいい

f:id:bibinbaleo:20200915110529p:plain

この話もこの記事に書いてあった

qiita.com

動画

動画再生は重いらしい

シェーダー

地面や空など描画面積が多い場所のシェーダーが重いと描画負荷がやばい

Quality設定

UltraからVeryHighにした

f:id:bibinbaleo:20200914133813p:plain

Qualityの設定はこちらの記事に書いてあるのを参考にして、個別に変えた

qiita.com

f:id:bibinbaleo:20200917145001p:plain

 Oculus設定

GPUの使用率が高くなるとフレーム落ちしないように自動的に解像度を下げるAdaptive Resolutionという機能を使用できます

Unityでの描画最適化について - フレームシンセシス

 知らなかった!

f:id:bibinbaleo:20200911141018p:plain

 Sceneビュー非表示

実行中にシーンビューを動かしていると重い。

komaken.me

その他設定 

テクスチャ、オーディオなどの設定を一括で変えられる。

使わないでも、どこを変えているかを知って勉強になった

github.com

オーディオファイル

オーディオファイルのSampleRateはデフォルトで44100だが、22,050などにしても通常問題ない。ファイルサイズと実行時のメモリ容量を減らせる

f:id:bibinbaleo:20201229110116p:plain

Applyして、再生して確認するいい。

ちなみに破壊音は11,025にしたら明らかに音が変わった

Mesh

インポートしたモデルの設定で圧縮率を変えられる

f:id:bibinbaleo:20201229162015p:plain