Unite2017 参加しました
Unity最適化講座 ~スペシャリストが教えるメモリとCPU使用率の負担最小化テクニック~
www.slideshare.net
Transformsについて
- TransformsはすべてのGameObjectが持っている。
- Transformsが変更されると、イベントメッセージが送られる。
- イベントメッセージはPhysics, Render, Particleなど様々なComponentsに対して送られる。
- Transformを変更すると、処理が高くつく
これからのTransformの変更方法
- SetPosisionAndRotation(Unity5.6~)を利用する。 このAPIを利用することで、無駄なイベントメッセージを減らすことができる。
Transformsが多すぎる問題
- Unityちゃん単体では150ものTransofrmsが存在する。
- Unityちゃんを大量に設置した場合、制御するTransformsが多すぎるため、パフォーマンスは悪くなる
大量のTransformsの最適化
- [inspector]->[Optimize Game Object] にチェックを入れる GameObejctに対するアニメーションをサブスレッドに投げることができる。 それをしないと、すべてメインスレッドで動いてします。
- 一部のTransformsを処理から除外する。(間引く) 除外対象を[Extra Tranforms to Expose]に追加する。
Physics
Physicsの中でも、以下の2つに計算コストがとられる
- Rigidbodyの更新など物理演算
- Raycast
Physicsを重くするには
- 狭い空間にたくさんのCollider(できればMeshCollider)を設置
Physicsを軽くするために
- RaycastのMaxDistanceパラメータを設定する
- Physics Layersを適切に設定することで、不要な処理を省く
- 物理演算の間隔を間引く(パフォーマンスと精度のトレードオフ) [Inspector]->[TimeManager]を制御。Timestepsは代替0.04か0.08くらい。 ただし、シミュレーションゲームでは安易に下げるのは危険
Rigidbodyの付いたGameObjectを操作するときの注意
- SetPositionAndRotationを利用してはいけない。計算コストが高くつく
- RigidBodyのMovePositionとMoveRotationを利用する。
Memory time
IL2CPP Memory Profiler
- IL2CPPのツールでメモリの展開MAPとその詳細が視覚的に見られる。
- UnityEngine.ObjectsとC# Object のメモリをみられる。
- タイルのように使用されているメモリの大きさがわかる
- タイルをクリックすることで詳細がみられる。
- Textureのメモリ使用状況もわかるので、重要でないTextureの削減を考えることができる。
hideFlags
- hideanddontsaveがついていると、そのメモリはアンロードされなくなる。
- memoryleakを簡単に作り出せる便利なフラグ
Texutres non-readble
- Textureを読み込むときに注意が必要
- readbleで読み込んでしまうと、Memoryを2倍使ってしまう。
- Textureをコードなどで変更する必要がないときはnon-readbleにする。
- Texture2Dなどで変更した際もapply時に、non-readbleにするとよい