なんとかするから、なんとかなる

エンジニア関係のことを書きます

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にするとよい