読者です 読者をやめる 読者になる 読者になる

好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

Unite Japan 2013 の1日目に行ってきたメモ

Unity プログラム

UNITY - Unite Japan タイムテーブル

個人的な思い出し用箇条書きメモ。かなり意訳。意訳しすぎて間違いを書いている可能性大。私以外が読むことはあまり考えていない。

基調講演

技術的な話はなかったので略。

永遠に続けていくつもりだから、10年後に今を振り返えれたりするといいなみたいなことを行っていた気がする。


Unity レンダリングパイプライン

セッションで使われたサンプルとスライド(.pdf)がダウンロード出来る。

http://is.gd/RenderingPipeline_UniteAsia13

#pragma muilti_compile とか、light probes とか、DX11対応機能の話とか。
スライドが公開されてるので書くこと無し。

Editor拡張で #pragma muilti_compile を使って書かれている Shader を切り替えるサンプル(CustomMatInspector)はとても参考になりそう。


シーン/メモリ/アセットバンドル

後日、動画の録画を配信するらしい。

シーンがどういう形式にビルドされているか
  • ビルドすると level0 とか *.assets とかいうファイルがシーンごとに作られる
    • 1つのシーンは Assetがまとまったファイルと、それ以外(シーンのヒエラルキに表示されてるような奴)の情報が入ったファイルで構成される
      • Assetsは複数シーンで重複しないように、シーン番号の若いシーンに入っているAssets以外は、それを参照でしょうするためのデータが入ってる
      • /Applications/Unity/Unity.app/Contents/Tools/binary2text で、Assetsの情報が入ったファイルをテキスト化するとなんとなく読める
シーンがどのようにロードされているか
  • おおまかな処理の順番:LoadLevelを呼ぶ → アセットのロード → Level(ヒエラルキとかの再現みたいな)のロード → 古いレベル、使っていないObjectのDestroy → Awake → GCC#の?)
  • ロードしてから古いレベルのDestroyが実行されるため、一時的に両方のレベルがメモリに乗ってしまう
    • Unityのメモリプロファイラでは1フレームの間に起きていることが検知しにくい
      • MacでビルドしてInstrumentsで見るなどすると良い
    • (LoadLevel した先のStartとかOnEnableで、LoadLevelAdditiveとかすれば避けられるんだろうか?)
メモリ

2日目のメモリープロファイリングのセミナーで詳しくやるということで軽めだった。

  • Monoが管理しているメモリ
    • 要は C# で使われているメモリ
    • GC.Collect() で解放
  • Unityが管理しているメモリ
    • GCでは解放されないので自前で開放する必要がある

AssetBundle

複数のAssetBundleでの重複Assetについて
  • 複数のAssetBundleに同じAssetが入っていると、重複分もメモリに乗ってしまう
    • PushAssetDependencies でAssetBundle同士の依存性を設定して、重複部分は参照情報だけになるAssetBundleを作成できる。
      • 弱点:参照はインデックス番号でされているため、参照先の中でのAssetの順番がずれると、参照元でずれたものを参照してしまう
    • BuildAssetBundleOptions.DeterministicAssetBundle
      • 参照がインデックスではなくIDになる
      • 弱点:読み込みの順番がファイル配置順を考慮しなくなるので、ディスクメディアからなどの読み込みだと極端にシーク時間がかかる可能性がある
AssetBundleの読み込み方法
  • 1番オススメ:LoadFromCacheOrDownload
    • ダウンロードしたものが展開された状態でストレージに保存される
      • 実行時の読み込みの際に、展開用のメモリが必要ない
      • その分、ストレージの容量は圧迫する
  • 2番目にオススメ:CreateFromFile
    • 圧縮していないAssetBundleしか使えない
    • 圧縮できないのでストレージの容量は圧迫する
  • 非おすすめ:WWW、CreateFromMemory
    • 展開に使う分のメモリが必要
    • 圧縮したAssetBundleが使える → ストレージ容量は節約できる
  • 過去の遺物:Resources
    • AssetBundleと比べて効率が悪い。今から作るならAssetBundleを使ったほうが良い

シリアライズ徹底解説

資料は twitterで @stramit を追っていればそのうちアップされるらしい

serialize

SerializeFieldとかNonSerializedとか。

コンストラクタで初期化してものは、ScriptableObjectで上書きされる*1

OnEnable() で null だったら new するようにすると、SerializeFieldで設定された値がない場合だけ初期化できる。

Custom property editor

話についていけてなかった。

Property Drawers in Unity 4 – Unity Technologies Blog ← この辺の Serialize 辺りの話をしていたのか?


Unityオーディオシステム・ツアー

ピッチとか音量をランダムで変えると、環境音の自然さが増すよね的な話などなど。

CRIの中の人ブログが詳しいので略。

Androidでコンテンツを守る方法 - Unity Androidでのプログラムとデータの暗号化、およびハッキング対策

資料はUniteのAsiaツアーが終わったら公開予定らしい。


Google Playと通信してのVerifiを定期的にすること。

各種データやコードでの生成物の難読化や暗号化

ネイティブアプリ時代のローカルデータ管理入門

保存の形式や方法
  • JSON
  • ScriptableObject(Unityのオブジェクト)
    • サイズも小さめで速度も早い
    • サーバーなどで動的に作るのは厳しい
  • MessagePack
    • サイズ小さめ
    • サーバーからの動的送信におすすめ
    • C# なら msgpack-cli を使うのが良い
  • PreyerPrefs
    • 編集が容易
    • メモリ上に全展開されるので、データが大きいとメモリを圧迫
    • 可視化されやすい
      • 設定の保存ぐらいにしか用途がない?
      • 難読化する?
  • Sqlite
    • Mono.Data.Sqlite.dll が必要
    • AndroidではSqlite3をNDKでビルドしたものが必要
    • めんどうならAssetStoreで購入。
      • SqliteKit(安定なら)
      • UniSqlite(使いやすい)
  • System.IO

画像ファイルの暗号化

  • AssetBundleを暗号化して、実行時に復号してCreateFromMemory
  • JPEGPNGを暗号化して、実行時に復号してCreateTexture

ファイルの圧縮

  • AssetBundleの圧縮形式を使う
  • UnityではSystem.IO.Compressが使えないので、他の動くものを使う

復号や解凍処理で処理を止めないために

  • コルーチンで少しずつやる
  • System.Threadが使えるので使う
    • スレッドを作るのが重いので、スレッドプールから持ってくるようにしておくと良い
    • アプリが非アクティブになった時のスレッドの挙動がiOSAndroidで違うことに注意
    • GC中はスレッドは止まる

2日目も行っているが、あとで書く。たぶん。