AssetBundle と TextureCompression のおはなし

Preview:

DESCRIPTION

第18回 Unity 勉強会 にて発表しました。

Citation preview

AssetBundle と TextureCompression のおは

なし〜 Mobile Platform に於けるリソース管理〜

株式会社キッズスター森 哲哉

こんばんは!

•Unity 、使ってますか!?

•Unity 、楽しいですね!

•今日は AssetBundle と Texture 圧縮について語りに来ました!!

と、その前に…。

Who am I ?

•“ 森 哲哉” と申します。

•a.k.a. もんりぃ / T: @monry / F: 本名

•29 歳 / ♂ / O 型 / 天秤座 / 既婚 / 趣味 : 合唱

•趣味は「お酒」と「合唱」です。

Who am I ?

• “ 株式会社キッズスター” って会社で働いてます。

• 未就学児〜小学生のお子さまをお持ちのファミリーをターゲットにした知育 / 教育に関わるアプリ・サービスを展開しております。

こえほん 森のえほん館 なりきり !!ごっこランド

パズル & テイルズ

レジュメ

•AssetBundle について

•TextureCompression について

前提

• 大前提として、 2D のお話しです!

• もっと言うと NGUI に限定してます

• iOS / Android なモバイル環境

• Unity 4.x (Pro) / NGUI 2.6.x

• Pro 版じゃないと AssetBundle を Build できない

• AssetBundle の話が 8 割です :-P

• 間違ったこと言うかも知れませんが、ツッコミ大歓迎です!!

AssetBundle の概要

• そもそも AssetBundle って…?

• Asset を Bundle したモノ

• 素材を纏めて一つのファイルとして扱うための技術

• よくある初回ダウンロードとか

• ソシャゲのカードの画像とか

AssetBundle の概要

•こんなの。 ( 宣伝じゃないですよ?w )

AssetBundle の長所

•Unity が解釈出来るモノなら詰め放題

•ただし、 iOS は JIT 実行不可

•WWW クラスを経由して取得

•キャッシュとかよしなにやってくれる

•バージョニングにも対応

AssetBundle の短所

• 基本的にサーバ必要

• Content-Type: application/vnd.unity を要返却

• ファイル名ユニーク

• basename で判定される

• ディレクトリ掘って管理とか㍉

• プラットフォーム毎に別ファイル

AssetBundle の運用

•じゃあ、その辺踏まえて、どうやるの?ってなお話しを。

•ここから先は、弊社での事例をベースに進めます。

•一つでも参考になるモノがあれば幸いです。

AssetBundle の環境

•初回リソースダウンロード

•2 回目以降は Cache 任せ

AmazonAmazonS3S3

AmazonAmazonS3S3

AmazonAmazonCloudFrontCloudFront

AmazonAmazonCloudFrontCloudFront

AppApp(Cache)(Cache)

AppApp(Cache)(Cache)

AppApp(Memory)(Memory)

AppApp(Memory)(Memory)

AmazonAmazonS3S3

AmazonAmazonS3S3

AmazonAmazonCloudFrontCloudFront

AmazonAmazonCloudFrontCloudFront

AppApp(Cache)(Cache)

AppApp(Cache)(Cache)

AppApp(Memory)(Memory)

AppApp(Memory)(Memory)

AssetBundle の環境

• チーム開発するなら git で管理

• バイナリだから微妙っちゃ微妙

• Asset Server ( 要 Team License) もアリか

• Editor Script 必須

• ググればいっぱい転がってます

• この勉強会の過去のセッションにも

AssetBundle の環境

• iOS / Android の両方に対応させる場合、Team License 買っとけ!

•BuildPipeline.BuildAssetBundle() の際に Import Asset が走るため、リソース数が多いとめっちゃ待つ。

•ので、 Cache Server 必須。

AssetBundle の設計

•粒度 ( 弊社の場合 )

•Atlas / Texture / AudioClip を個別にビルド

•1 画面 (≠ シーン ) 内に最大 10個を目安

•初回 DL時のキャッシュに結構依存• どうにかしたいんだけどね…。

AssetBundle の設計

•更新頻度 ( 弊社の場合 )

•原則的に iOS の申請スケジュールが基準

•そもそも更新頻度が高いモノは API とか経由した方が管理が楽

•BASE64 なテキストを食わせるとか

AssetBundle の設計

• 初回 DL するネタ一覧 ( 弊社の場合 )

• 敢えてアプリ内 (Assets/Resources/) に .txt (TSV な TextAsset) を保持

• ファイル名 <TAB> バージョン <LF>

• 毎回起動時にこのリストをチェック

• WWW.LoadFromCacheOrDownload に任せて Cache が有するバージョンと異なるなら DL

AssetBundle の設計

•ファイル名 ( 弊社の場合 )• プラットフォーム名 /種別 @ シーン名 @ 画面名 @ ファイル

名 .unity3d

•プラットフォーム名は iOS, Android, Editor など

•種別は Atlas, AudioClip, Texture など

AssetBundle の構築

•Editor Script でがんばる。

Supporting Files/ 種別 /  シーン名 /   画面名 /    ファイル名

この構造決め打ちでディレクトリ内のファイルを走査

AssetBundle の配信

•S3 を Origin とした CloudFront

•“ バージョン番号 / プラットフォーム /” なディレクトリ以下に配置

•Editor Script で書き出したディレクトリを丸っと PUT 出来ると楽ちん

注意点

• 適切な差分ビルドを行わないとダメ

• 何か良い案無いっすか?w

• WWW はタイムアウトの実装が無いので、自前で組む必要あり

• CloudFront 使う場合、開発中は Origin から直接 DL した方が良い

• CF 側の Cache Invalidation とか大変だし。

Texture Compression

•テクスチャの圧縮

•Inspector の Format に色々出てくるけど、要するにどういうコト…?

Texture Compression

• デバイス毎に、展開出来るフォーマットと出来ないフォーマットがある

• GPU に依存

• 展開出来なかった場合は、無圧縮のテクスチャを一気にメモリに載せるっぽい

• 全画面テクスチャとか描画に 1sec掛かるコトも。

Texture Compression

•で、最適なのは?

• iOS は PowerVR (PVR) にしとけば OK

•RGBA Compressed PVRTC 4 bitsがオススメ

•こだわるなら Texture 別に実機で見つつ適切に選んでね

そう、 iPhone ならね。

Texture Compression

•で、 Android は?

•… 。

•……… 。

•最適解はありません! orz

Texture Compression

•と、言いたいところですが、 7 割以上が Adreno に対応しているようなので、ATC が良いんじゃないかと。

出展 : NTT レゾナントさまの Remote TestKit 端末一覧http://appkitbox.com/testkit/smartphone

Texture Compression

•非対応端末は…?

•ぶっちゃけ切り捨てる方が精神衛生上よろしいのでは?

•少なくとも「読めない」というコトは無い ( っぽい ) ので、サイズ次第では何とかなるかも。

Texture Compression

•WebPlayer / Standalone / etc… は?

•まだ作ったこと無いので分かりません! ( キリッ

•寧ろ情報交換しましょう!

まとめ•AssetBundle

•Editor Script が肝要

•ちゃんと運用見据えて設計すべし

•Texture Compression

•Android のサポート次第

•ドラスティックな判断も必要かも

Any Questions?

Thank you for your attention!!!

Recommended