問 - iOS において、アプリが実際にどれほどのメモリを消費しているか知りたい。特に Unity を使用したアプリにおいて、テクスチャがどのようにメモリを占有しているのか、正確に把握したい。
答 - Instruments の VM Tracker を使うのがいい。
他にも様々な解析の手法は存在するけども、例えばテクスチャのように、一般的なメモリ管理システムを通さず直に仮想メモリ空間にマッピングされるものについては、その挙動をつかむことが難しい。仮想メモリの監視ツール VM Tracker を使えば、その首根っこをつかんで観察することができる。
Instruments の Allocations テンプレートを使ってプロファイリングを開始する。
VM Tracker はスナップショットを取得した瞬間のメモリの状態を分析するものだ。解析したいタイミングが来たら、"Snapshot Now" ボタンを押してスナップショットを取る。
スナップショットから仮想メモリの割り当て状況を分析できる。"Dirty Size" がアプリの占有している物理メモリのサイズだと考えていい。
個人的には Regions Map 表示が好きだ。仮想メモリ空間の構成を割り当て領域単位で詳細に観察することができる。
Unity に限らず OpenGL ES を使用するゲームアプリ全般において膨らみがちなのは、IO Kit によって占有される領域だ。
IO Kit とは iOS においてデバイスドライバの実装に用いられるフレームワークの一種で、ここでは主に OpenGL がテクスチャやフレームの格納に用いるメモリとして取得したものが表示されている。
これを観察することにより、特にテクスチャによるメモリ消費の実態を、かなり正確に把握することができる。
Virtual Size / Resident Size / Dirty Size の違い
Virtual Size は仮想メモリ空間として確保されているサイズを、Resident Size はその中で実際に物理メモリがマッピングされいる領域のサイズを、Dirty Size はその中で書き換えが行われた領域のサイズを表す。
Apple の技術文書によると、iOS においては、空きメモリ容量が一定量を下回った場合に非アクティブかつ未書き換えなページはフラッシュされると記されている。
iOS で仮想メモリの1ページって何バイト?
4096 バイト。
OpenGL を使うだけで IO Kit に数 MB 食われる
恐らくフレームバッファの分。Retina iPhone で 16 bit カラーバッファなら約 3.6 MB、32 bit カラーバッファなら約 5.9 MB は使われるはず。