しがないエンジニアのブログ

技術的な内容をメモ代わりにつらつら

[Unite2018] その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session32

講演者

Valentin Simonov (Unity Technologies Field Engineer)

SlideShare

https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyo-96358722/UnityTechnologiesJapan/unite-2018-tokyo-96358722

概要

  • メモリの種類について
  • Dirty Memoryを最小限に抑えるべし
  • 最適化ツールの紹介

内容

  • メモリ消費の管理
    • ツールごとに値が様々
    • what kind of memory?
    • RAM(物理メモリ)
      • 物理的なメモリ
      • 上限を超えられない
        f:id:turgure:20180614083307j:plain
    • Virtual Memory(VM)
      • RAMの一部を借りる
      • iOSのアプリはVM上で動く
      • pageとしてメモリのアロケートをする
        f:id:turgure:20180614083356j:plain
    • Resident Memory
      • VMの一部
      • 使用せず、確保するだけ
        f:id:turgure:20180614083415j:plain
    • Clean and Dirty Memory
      • Clean Memory
        • readonlyなメモリ領域
          • binaryファイルなど
      • Dirty Memory
        • そのた
          f:id:turgure:20180614083650j:plain f:id:turgure:20180614083657j:plain
    • Graphics Memory(VRAM)
      • GPUとCPUが共有する物理メモリ
      • ほとんどがResident or Dirty memory
        f:id:turgure:20180614083749j:plain
    • Malloc Heap
      • VMの一部
      • malloc/callocで確保される
        f:id:turgure:20180614083756j:plain
    • Swapped(compressed) Memory
      • 圧縮されていないDirty Memory
      • 圧縮されたDirty Memory
        f:id:turgure:20180618083329j:plain
    • Native(Unity) Memory
      • Native Memory
        • malloc heap(VM)の一部
        • すべてのassetはNM上で管理
          f:id:turgure:20180618083458j:plain
    • Native Plugin
    • Mono Heap
      • NMの一部
      • .NETバーチャルマシンの一部
      • 連続したものではなく、断続的なもの
        f:id:turgure:20180618083539j:plain f:id:turgure:20180618083600j:plain


  • iOSメモリ管理
    • iOSマルチタスクメモリ
    • 物理メモリが少なくなると、物理メモリを開放しようとする
      1. Clean Memoryの削除
      2. Dirty Memoryの使用が多い場合、警告を発する
      3. 確保できなかった場合、Dirty Memoryを削除
    • Dirty Memoryのサイズを最小限に抑える!
      • Dirty Memoryの使用量を把握する
      • Dirty Memoryを使用しているオブジェクトを減らす
      • Note. 圧縮のやりやすさ、やりにくさがある


  • Tools
    • Unity Profiler
      • 内部ツール
      • Simple View
        • Mono(used)
          • Mono Heapサイズ(ピンクと緑の総和)
        • Mono(total)
          • Mono Heapに対してcommitされた総量
        • GfxDriver
          • 2Dの総量 – renderターゲット
        • FMOD
          • audioがリクエストしたサイズの総量
        • 他の値は使い物になっていない
      • Detailed View
        • Native Memory上のオブジェクト名
        • Native Memory上でアセットをどれくらい消費しているか
    • Memory Profiler
      • 外部ツール
      • BitBucket
        • Assets(VM)
        • Asset(GPU)
        • Managed object(Mono)
          • コンテンツリストの確認
        • オブジェクト参照ができる
        • 相対的サイズの確認が用意
    • Memory Profiler Extension
      • Github
        • Mono Heapのブロックを確認できる
    • Xcode Debug View
      • メモリ管理
        • Dirty Memory + Swapped Memoryだと思われる
        • 黄色いゾーンに入ってきたとき、終了される確率が高まる
    • VM Tracker
      • アプリケーションのメモリの消費量
      • 扱いが難しい
        • www dcのカンファレンスを見る
        • 他のuniteの講演を見る
      • Dirty Memory/Graphics Drive/Mono Heap/Malloc Heapなどの確認が可能
      • いつ、なぜの確認ができない
    • Allocations Instrument
      • stack traceが可能
        • ex) asset bundleのロードの確認、metadataの初期化の確認
        • parsing JSON
      • すべてVM