スライド 1

工程の手戻りを最小限に
Confidential
2Dエンジン活用における傾向と対策
小高 輝真(株式会社ウェブテクノロジ)
東田 弘樹(フリーランス・プログラマ)
CEDEC 2014 で行った講演のスライドです。
http://cedec.cesa.or.jp/2014/session/ENG/6589.html
このファイルは http://cedil.cesa.or.jp/ および
http://www.webtech.co.jp/blog/game-develop/7179/ で公開しています。
Ver. 2014/9/19
工程の手戻りを最小限に
Confidential
2Dエンジン活用における傾向と対策
セッションの内容
ゲームエンジンを活用して2Dゲームアプリを開発する際に、事前の調査を
しっかり行うことで、手戻りを起こさないための情報を提供します。
UnityとCocos2d-xで動作する同じ仕様のゲーム風アプリを使い、各種端末で
性能比較を行います。
Unity、Cocos2d-x上で2Dゲームを開発する際のTipsをご紹介します。
受講スキル
 小規模チームで、スマホ向け2Dゲーム開発に関わるプログラマ
 幅広いユーザーに向けたスマホ向け2Dゲームの開発者
受講者が得られる知見
 2Dゲームエンジンで、性能見積をするための実際的な情報(テストアプリのソース付)
 主に画像の取扱に関するTips
対象プラットフォーム
Android, iOS
1
アジェンダ
第1部




2Dゲームエンジンとは
主なゲームエンジン、特にUnityとCocos2d-xについてのご紹介
第2部

Confidential
スプライト描画負荷のベンチマーク
Cocos2d-x v3とUnityの描画性能差
Cocos2d-x v2とv3の描画性能差
機種による描画性能差
バッチについて
第3部

8つのTips
2
講演者紹介
Confidential
小高 輝真
株式会社ウェブテクノロジ 代表取締役
元プログラマ
元テクニカルライタ
CEDEC運営委員
スポンサープログラムWGリーダー
写真は、GameBusiness.jp
「OPTPiXはこうして生まれた!
ウェブテクノロジ設立物語(前編)」より
http://www.gamebusiness.jp/article.php?id=9350
3
講演者紹介
小高
輝真
Confidential
4
講演者紹介
小高
輝真
Confidential
5
講演者紹介
Confidential
東田 弘樹
フリーランス・プログラマ
ゲームボーイの時代頃よりゲームプログラマとして従事。
フリーランスになってからゲーム以外のプログラム開発案件にも関わりつつ
最近はゲーム開発を支援する裏方として、ツール開発などに従事しています。
6
第1部
Confidential
2Dゲームエンジンとは
7
2Dゲームエンジンとは
Confidential
このセッションでは、2Dゲームエンジンについて
「2Dゲームを作成するために使いやすいゲームエンジン」
と定義
3Dエンジンは除くが、Unityは現在2Dゲーム制作にも広く使われており、
Unityには2D機能も提供されているため、このセッションの対象とする
8
2Dゲームエンジンのメリット
Confidential
 マルチプラットフォーム対応
ゲームエンジンがプラットフォームごとの差異を吸収してくれるので、
1ソースでマルチプラットフォームの開発が行える
 高速化
ハードウェアの性能を出すにはOpenGLの使用が必須
しかし、OpenGLで2Dの表現をするのは案外面倒
ゲームエンジンが肩代わりしてくれる
 時間節約
2Dであれば、比較的定型の処理が多い
ゲームエンジンが必要な機能を備えている
9
代表的な2Dゲームエンジン
Confidential
Unity
Cocos2d-x
Starling
Sprite Kit
Corona SDK
Marmalade SDK
…
10
Unity
Confidential
主な特徴
● プロトタイプの開発が早い。独自エディタを使っての開発が主
● 2Dに3Dの表現を組み合わせることができる
● 自分が作りたいゲームにあったAsset(サードパーティ製のプラグインのようなもの)が見つかれ
ば、非常に生産性が高くなる
● 対応プラットフォーム: iOS, Android, Windows, Mac, Linux, Webブラウザ, PlayStationⓇ
4/3/Vita, Xbox ONE/360, Wii U™
● ライセンス等: Unity Free 無料(制限あり)、 Unity Pro 162,000円
● 開発言語: C#, JavaScript, Boo
● IDE: Unity エディタ, Mono Develop 4(替わりにVisualStudioも使用可 ※UnityVS)
● 物理エンジン: あり
● パーティクル: あり
● http://japan.unity3d.com/
11
Cocos2d-x
Confidential
主な特徴
● 2Dゲームエンジン
C++での開発に馴れたコンシューマ・ゲーム開発経験者には使いやすい
● 対応プラットフォーム: iOS 5.0以降, Android 2.3以降, Windows 7以降, OS X 10.6以降,
Windows Phone 8
● ライセンス等: 無償, オープンソース(MITライセンス)
● 開発言語: C++(C++11), Lua/JavaScriptを使っての開発も可
● 使用可能IDE: Visual Studio 2012以降, Xcode 4.6以降
● 物理エンジン: あり(Chipmunk2D, Box2D)
● パーティクル: あり
● http://www.cocos2d-x.org/
上記はCocos2d-x v3の情報です
12
Starling
Confidential
主な特徴
● AIR/Flash上で動く
● 対応プラットフォーム: AIR/Flashが動くもの(iOS, Android, Windows, Mac, Linux, Webブ
ラウザ)
● ライセンス等: 無償利用可, オープンソース
● 開発言語: ActionScript 3
● 使用可能IDE :Flash Builder 4.7, FlashDevelop
● 日本語情報: かなり少ない
● 物理エンジン: 標準ではなし
● パーティクル: あり
● http://gamua.com/starling/
● GPUで描画(Stage3Dを使用)
● AIRというと別途ランタイムのインストールが必要そうだが、iOS, Androidはアプリの中にラ
ンタイムが組み込まれる
● 気になること…Adobe がAIR/Flashをいつまでサポートするのか
13
Sprite Kit
Confidential
主な特徴
● iOS, Mac OS X標準の2Dグラフィック・フレームワーク
● 対応プラットフォーム: iOS 7.0以降, OS X 10.9以降
● ライセンス等: 無償利用可, ソース非公開
● 開発言語: Objective-C(C++, C), Swift
● 使用可能IDE : Xcode
● 日本語情報: 若干。日本語書籍は1冊(2014/8現在)
● 物理エンジン: あり
● パーティクル: あり
● https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual
/SpriteKit_PG/Introduction/Introduction.html
● 気になること… Androidとのマルチプラットフォーム開発ができない
14
Corona SDK
Confidential
主な特徴
● クラウドコンパイルのため環境構築がラク
● ライトゲームの作成に向いている
● 対応プラットフォーム: iOS 5.1以降, Android 2.2以降, Windows Phone 8(予定)
● ライセンス等: US$16.00/月~
● 開発言語: Lua ※ライセンス次第でネイティブ言語も合わせて使用可
● 使用可能IDE : Corona Editor(Sublime Text用プラグイン)
● 日本語情報: かなり少ない
● 物理エンジン: あり(Box2D)
● パーティクル: あり
● http://coronalabs.com/
● 気になること
○ クラウドコンパイルのため、サービス継続性のリスク
○ ソースをクラウドにアップロードする必要があるため、それが許容できるかどうか
○ Enterpriseライセンスではオフラインビルドも可能
15
Marmalade SDK
Confidential
主な特徴
● 2D/3Dの開発が可能
● 対応プラットフォーム: iOS 5.0以降, Android 2.2以降, Windows Phone 8, BlackBerry,
TIZEN, Windows, Mac(Win/MacはUS$499/月ライセンスから可)
● ライセンス等: フリー版あり(サポート限定), US$15/月~
● 開発言語: C++
● 使用可能IDE: Visual Studio, Xcode
● 日本語情報: かなり少ない
● https://www.madewithmarmalade.com/
● ミドルウェアとの組み合わせで、LuaもしくはObjective-Cを使った開発も可
● Objective-Cを使った組み合わせでは、iOS向けに作ったプロジェクトをAndroidに移植するよ
うな用途にも使える
16
代表的な2Dゲームエンジン
Confidential
Unity
Cocos2d-x
Starling
Sprite Kit
Corona SDK
Marmalade SDK
…
17
Unity
Confidential
● 最新版はv4.5.3、v4.6がオープンβ中。v5はまもなく登場?
● 情報量とサポート
• Unityテクノロジーズジャパン合同会社のサポートが受けられる
• 日本語書籍は20冊以上(ただ3D機能についてが中心)
• ネット上にも日本語情報が溢れている
18
Unity
Confidential
 v4.6で、UIエディタが搭載
 Unity Cloud Build(β)
 Git/svnのリポジトリを登録しておくと、自動的にビルド、配信(テス
ト向け)まで行ってくれる
 Unity Pro限定
19
Cocos2d-x
Confidential
● 最新版はv3.2、v2はv2.2.5
● 情報量
• 日本語書籍は6冊程度。ただし、v2のものがほとんど
• ネット上の日本語情報はかなり増えてきている
20
Cocos2d-x
Confidential
v3になって何が変わったか?
● Objective-C的パターンからC++11へ
● 新しいレンダラーの導入
● 自動バッチング、自動カリング、グローバルZオーダー導入
● ラベルの改善
● イベント処理の改善
● タッチ処理がより扱いやすく
● 3Dモデルが表示可能に(v3.1から)
https://github.com/cocos2d/cocos2d-x/blob/cocos2d-x3.0/docs/RELEASE_NOTES.md#user-content-highlights-of-v30
21
Cocos2d-x
Confidential
気になるところ…
サウンドの機能が弱い、v3でも変わらず
 最低限のAPIしか用意されていない
 音ゲーのようなもをお考えの方は事前確認を
 ミドルウェアに頼る手も CRI ADX2 for Smartphone
22
第2部
Confidential
スプライト描画負荷のベンチマーク
ここで使用したテストアプリのソースファイルは、
http://www.webtech.co.jp/blog/game-develop/7179/
で公開しています。
23
基本的なスプライト描画負荷テストアプリ
Confidential
画面上にスプライトを増やしていき、その描画負荷を計測
スプライトはアニメーションなし
画面タッチで描画スプライト数が増加
使用テクスチャの枚数により2パターンを検証
o 1枚のテクスチャのみで描画
o 16枚のテクスチャを順番に切り替えて描画
● テクスチャは、96x96ピクセル、RGBA4444(.pvrに格納)
● アプリ名: 1TexSpr, 16TexSpr
● Unity v4.5.2, Cocos2d-x v3.2, v2.2.5(Batchあり・な
し)で検証
●
●
●
●
24
基本的なスプライト描画負荷テストアプリ
96 x 96
(RGBA4444) x1枚
Confidential
96 x 96
(RGBA4444) x16枚
25
ゲーム風アプリ
●
●
●
●
●
●
●
●
Confidential
画面上に多関節アニメするキャラクターを増やしていき、
その描画負荷を計測
キャラクターは11パーツ(スプライト)で構成
ボタンでキャラクターを増減可能
サウンドあり(BGMをMP3で再生)
使用テクスチャの構成により3パターンで検証
o 1枚のみ
o 白ネコ、黒ネコのテクスチャ2枚
o 白ネコ、黒ネコ、洋服、帽子、めがね、
などテクスチャ8枚
テクスチャフォーマットは、RGBA4444(.pvrに格納)
アプリ名: Multi
Unity v4.5.2, Cocos2d-x v3.2, v2.2.5(Batchあり・なし)で検証
※テクスチャ8枚構成のv2 Batchありは未計測
26
ゲーム風アプリ
1024 x 1024
(RGBA4444) x1枚
1024 x 1024
(RGBA4444) x2枚
Confidential
8枚
※装備品は単体画像側を使用
1024 x2枚, 512 x4枚, 256 x2枚
27
スプライト描画性能比較
検証端末
Confidential
端末名
発売日
CPU
画面解像度
備考
1
Xperia arc
(docomo SO-01C)
2011/03
Qualcomm Snapdragon MSM8255
1GHz
Qualcomm Adreno 205 GPU
480×854
Android 2.3.4
2
Nexus 5
(LG-D821)
2013/11
Qualcomm Snapdragon MSM8974
2.26GHz(クアッドコア)
Qualcomm Adreno 330 GPU
1920×1080
Android 4.4.0
3
iPhone 4
2010/6
Cortex-A8(Single) 800MHz
PowerVR SGX535
960x640
4
iPhone 4S
2011/10
Coretex-A9(Dual) 800MHz
PowerVR SGX543MP2(Dual)
960x640
5
iPhone 5
2012/9
ARMv7s(Dual) 1.3GHz
PowerVR SGX543MP3(Triple)
1136x640
28
スプライト描画性能比較
Confidential
比較内容
1. Cocos2d-x v3とUnityの描画性能差(2パターン)
2. Cocos2d-x v2とv3の描画性能差(3パターン)
3. 機種による描画性能差(4パターン)
2D描画性能を比較するためにいくつか要素の異なるスプライトを1フレームにいくつ描画できるかを計測
計測方法は、描画するスプライトを徐々に増やしていき、30FPS を維持できる最大数を求めた
29
スプライト描画性能比較(Part 1)
Confidential
Cocos2d-x v3とUnityの描画性能差(1)
●
●
使用アプリ: 1TexSpr (基本的なスプライト描画負荷テストアプリ)
テストの内容:
o
1枚のテクスチャ(96x96、RGBA4444)から、スプライトを多数描画するのみ
o
非常にプリミティブな機能の計測
●
テスト結果:
●
Cocos2d-x v3
Unity
iPhone 5
5450個
3500個
Nexus 5
5670個
3400個
考察:
o
iPhone 5では、Cocos2d-xがUnityの約1.6倍、Nexus 5では約1.7倍のパフォーマンス
o
iPhone 5とNexus 5はほぼ互角(UnityはiPhone 5が3%優位、Cocos2d-x v3はNexus 5が4%優位)
30
スプライト描画性能比較(Part 1)
Confidential
Cocos2d-x v3とUnityの描画性能差(2)
●
●
●
●
使用アプリ: Multi (ゲーム風アプリ)
テストの内容:
o
2枚のテクスチャ(1024x1024、RGBA4444)から、複数スプライトで構成されたキャラクタを多数描画
o
UIボタン、サウンドあり
o
実際のゲームアプリに近い構成
テスト結果:
Cocos2d-x v3
Unity
iPhone 5
194個
125個
Nexus 5
99個
76個
考察:
o
iPhone 5では、Cocos2d-xが Unityの約1.6倍、Nexus 5では約1.3倍のパフォーマンス
o
この条件ではiPhone 5がかなり優位(Unityで約1.6倍、Cocos2d-x v3で約2倍のパフォーマンス)
31
スプライト描画性能比較(Part 1)
Confidential
Cocos2d-x v3とUnityの描画性能差
 特定のプラットフォーム、特定の機種
だけでパフォーマンスチェックしてい
ると、手戻り発生の可能性あり
32
スプライト描画性能比較(Part 2)
Confidential
Cocos2d-x v2とv3の描画性能差(1)
●
●
使用アプリ: 1TexSpr (基本的なスプライト描画負荷テストアプリ)
テストの内容:
o
1枚のテクスチャ(96x96、RGBA4444)から、スプライトを多数描画するのみ
o
非常にプリミティブな機能の計測
●
テスト結果:
●
Cocos2d-x v2
(バッチなし)
Cocos2d-x v3
(自動バッチ)
iPhone 5
4444個
5450個
Nexus 5
1450個
5670個
考察:
o
Nexus 5では、v3がv2(バッチなし)の約3.9倍のパフォーマンス。バッチの効果は絶大
o
iPhone 5では、v3がv2(バッチなし)の約1.2倍でしかない。というより、バッチなしでも高速
33
スプライト描画性能比較(Part 2)
Confidential
Cocos2d-x v2とv3の描画性能差(2)
●
●
●
●
使用アプリ: Multi (ゲーム風アプリ)
テストの内容:
o
2枚のテクスチャ(1024x1024、RGBA4444)から、複数スプライトで構成されたキャラクタを多数描画
o
UIボタン、サウンドあり
o
実際のゲームアプリに近い構成
テスト結果:
Cocos2d-x v2
(バッチなし)
Cocos2d-x v3
(自動バッチ)
iPhone 5
224個
194個
Nexus 5
84個
99個
考察:
o
iPhone では、v2(バッチなし)がv3の+15%、Nexus 5 では逆にv3がv2(バッチなし)の+18%のパフォーマンス
o
実際のゲームアプリに近い構成では、v3の優位が揺らいでいる
34
スプライト描画性能比較(Part 2)
Confidential
Cocos2d-x v2とv3の描画性能差(3)
●
●
●
●
使用アプリ: Multi (ゲーム風アプリ)
テストの内容:
o
2枚のテクスチャ(1024x1024、RGBA4444)から、複数スプライトで構成されたキャラクタを多数描画
o
UIボタン、サウンドあり
o
実際のゲームアプリに近い構成
テスト結果:
Cocos2d-x v2
(バッチあり)
Cocos2d-x v3
(自動バッチ)
iPhone 5
275個
194個
Nexus 5
226個
99個
考察:
o
iPhone では、v2(バッチあり)がv3の約1.4倍、Nexus 5 では約2.3倍のパフォーマンス
o
Cocs2d-x v2で、手動で理想的なバッチを組めれば、v3よりも高パフォーマンスを出せる
o
ただし、このアプリのv2 バッチありでは必ずバッチが効くという理想状態を計測しているので、注意
35
スプライト描画性能比較(Part 2)
Confidential
Cocos2d-x v2とv3の描画性能差
 Cocos2d-x v3で導入された自動バッチ
は、複雑な描画の場合は、必ずしもバ
ッチなしv2より高性能になるとは限ら
ない
36
スプライト描画性能比較(Part 3)
Confidential
機種による描画性能差
●
●
使用アプリ: 1TexSpr (基本的なスプライト描画負荷テストアプリ; テクスチャ1枚)
テスト結果:
Cocos2d-x v2
(バッチなし)
Cocos2d-x v2
(バッチあり)
Cocos2d-x v3
(自動バッチ)
Unity
iPhone 4
510個
520個
560個
980個
iPhone 4S
1960個
2000個
2050個
1800個
iPhone 5
4444個
5430個
5450個
3500個
Xperia arc
440個
580個
620個
560個
Nexus 5
1450個
10100個
5670個
3400個
37
スプライト描画性能比較(Part 3)
Confidential
機種による描画性能差
●
●
使用アプリ: 16TexSpr (基本的なスプライト描画負荷テストアプリ; テクスチャ16枚)
テスト結果:
Cocos2d-x v2
(バッチなし)
Cocos2d-x v2
(バッチあり)
Cocos2d-x v3
(自動バッチ)
Unity
iPhone 4
510個
505個
530個
280個
iPhone 4S
1820個
1900個
1930個
490個
iPhone 5
3400個
5220個
4180個
880個
Xperia arc
425個
580個
540個
165個
Nexus 5
1150個
9890個
2150個
500個
38
スプライト描画性能比較(Part 3)
Confidential
機種による描画性能差
●
●
使用アプリ: Multi (ゲーム風アプリ; テクスチャ1枚)
テスト結果:
Cocos2d-x v2
(バッチなし)
Cocos2d-x v2
(バッチあり)
Cocos2d-x v3
(自動バッチ)
Unity
iPhone 4
49個
49個
50個
32個
iPhone 4S
135個
189個
125個
83個
iPhone 5
233個
292個
200個
135個
Xperia arc
27個
24個
36個
31個
Nexus 5
85個
236個
107個
102個
39
スプライト描画性能比較(Part 3)
Confidential
機種による描画性能差
●
●
使用アプリ: Multi (ゲーム風アプリ; テクスチャ2枚)
テスト結果:
Cocos2d-x v2
(バッチなし)
Cocos2d-x v2
(バッチあり)
Cocos2d-x v3
(自動バッチ)
Unity
iPhone 4
48個
48個
45個
31個
iPhone 4S
132個
178個
122個
76個
iPhone 5
224個
275個
194個
125個
Xperia arc
27個
24個
36個
30個
Nexus 5
84個
226個
99個
76個
40
スプライト描画性能比較(Part 3)
Confidential
 スマホ世代間の性能差は結構大
きい
 Cocos2d-xに比べると、
Unityはテクスチャの枚数がパ
フォーマンスにより影響を与え
る
41
スプライト描画性能比較
Confidential
手戻りしないために
 スマホの世代による性能差はわりと大きい
 スマホの性能は、今後もしばらく向上が予想されるので、リリース時点の状況を予測して、ど
こまで古い機種をサポートするのかを良く検討した方が良い
 Cocos2d-xのほうがパフォーマンスが安定している。Unityは扱うテクスチャの枚数が増える
とパフォーマンスがより落ちる傾向にある、ただ本来3Dエンジンであることを加味すれば十
分健闘している
 パフォーマンスが決定的に重要な場合はCocos2d-xを、そうでなければ開発のしやすさ優先で
エンジンを選ぶのが良さそう
 iPhoneで先行して開発していると、Androidで性能が出ない場合がある。
定期的に、ターゲット範囲の底辺の機種でパフォーマンスを確認しておく
42
ドローコールとは?
Confidential
• GPU に対して描画開始を命令すること
• この呼び出し回数が多ければ、多いほど描画負荷が上がる
• バッチングを活用することで、ドローコールを減らすことができる
43
ドローコールが増える要因
Confidential
GPUステートの変更(テクスチャやシェーダの変更)によって増える
A-1
1
2
B-1
テクスチャA
A-2
3
変更
4
B-2
テクスチャB
変更
変更
ドローコール4
44
バッチングとは?
Confidential
同じテクスチャを使ったものを一度にまとめて描画する
A-1
1
2
B-1
テクスチャA
A-2
1
2
B-2
テクスチャB
変更
ドローコール2
45
バッチングと描画順序の関係
Confidential
重なっている状態でバッチングすると描画順が狂う
A-1
1
2
B-1
テクスチャA
1
A-2
2
B-2
テクスチャB
変更
ドローコール2
46
バッチングと描画順序の関係
Confidential
描画順を守るためバッチングできない
A-1
1
2
B-1
テクスチャA
3
A-2
変更
4
B-2
テクスチャB
変更
変更
ドローコール4
47
テクスチャのアトラス化
Confidential
バッチングできるようにテクスチャを1枚に合体する
A-1
1
1
B-1
1
A-2
1
B-2
テクスチャ
A+B
ドローコール1
※ただし、現実的には必ずしも一枚のテクスチャに全ての画像を収められるとは限らない
48
バッチングのまとめ
Confidential
• Unity, Cocos2d-x Ver.3系では自動バッチングに対応している
• Cocos2d-x Ver.2系では手動でバッチングする必要がある
• 自動、手動問わずバッチングを有効にする工夫が重要
• 参考情報
http://japan.unity3d.com/unite/unite2014/files/DAY1-1700-room3-WebTechnologyAndKLab.pdf
49
第3部
Tips
Tips
Tips
Tips
Tips
Tips
Tips
Tips
-
Tips
#01
#02
#03
#04
#05
#06
#07
#08
Confidential
適切な画像リソースの作り方(Unity編)
適切な画像リソースの作り方(Cocos2d-x編)
2DゲームでPVRTC,ETCを使う場合の注意点
.pvrファイルをSpriteとして使う方法(Unity)
どの範囲の機種をサポートするべきか
Androidの画面解像度
カタログスペックと実測値の乖離
プロファイラ
50
Tips - #01 適切な画像リソースの作り方(Unity編)
Confidential
Unity で、描画性能や画質を向上させるためのノウハウ
51
Tips - #01 適切な画像リソースの作り方(Unity編)
Compressed(デフォルト)


RGBA8888(PNG32, PSD) → RGBA4444(16bpp)
RGB888(PNG24)
→ ETC(4bpp)

RGBA8888(PNG32, PSD) → PVRTC(4bpp)
RGB888(PNG24)
→ PVRTC(4bpp)
TrueColor
Android, iOS


RGBA8888(PNG32, PSD) → RGBA8888(32bpp)
RGB888(PNG24)
→ RGB888(24bpp)
16bits

自然画向き・高圧縮率
UIパーツ・アニメ調には不向き
iOS


RGB階調が少なく低画質
エフェクト向き
Android


Confidential
Android, iOS


最も高画質
容量が大きい
結構高画質
UI・アニメ調OK
アルファやヌキは持てない
RGBA8888(PNG32, PSD) → RGBA4444(16bpp)
RGB888(PNG24)
→ RGB565(16bpp)
52
Tips - #01 適切な画像リソースの作り方(Unity編)
Confidential
.pvrコンテナにダイレクトカラーを格納して使う
ダイレクトカラーが格納可能







RGB565
RGBA5551
RGBA4444
結構高画質
UI・アニメ調OK
アルファやヌキは持てない
そこそこ高画質
UI・アニメ調OK
ヌキが持てる
RGB階調が少なく低画質
エフェクト向き
PVRTCやETCにはかなわないが、そこそこ高速
減色ツールを選べば、画質劣化も最小限
Android, iOSで共通に使える
.pvrコンテナ自体は非圧縮だが、.apk や .ipa ファイルでパッケージ化される
ときには圧縮されるので、ダウンロードのサイズはそれほど増えない
53
Tips - #01 適切な画像リソースの作り方(Unity編)
Confidential
.pvrコンテナにダイレクトカラーを格納して使う
.pvrコンテナを使うもう一つのメリット
PSDやPNGでは、ビルドターゲット(iOS/Android)を切り替えるたびに画像ファイルの
リソースをすべて変換する処理が入り、ファイル数が多いと数10分に及ぶこともある。
.pvrコンテナの画像では、この自動変換は行われないため、ビルドが高速化する。


その他の参考情報
o
o
o
o
o
o
16bppはPNGで保存できないため、.pvrコンテナを使う必要がある
Unityは、.pvrコンテナの画像は変換しない。TrueColor, 16bitsを指定しても無視される
.pvr コンテナへのダイレクトカラー出力は、OPTPiX iméstaなどが対応している
.pvr ファイルはVer.2、垂直Flip(垂直反転)を指定しておく
.pvr コンテナのダイレクトカラーテクスチャは、縦横ドット数は任意に指定できる
(PVRTCテクスチャは、2の累乗平方ドットのみ格納可能)
どうしても16bppの画質では許容できない場合だけ、PNG24のファイルを使い、TrueColorを指定する
54
Tips - #02 適切な画像リソースの作り方(Cocos2d-x編)
Confidential
Cocos2d-x で、
描画性能や画質を向上させるためのノウハウ


PNG32 をロード → 内部では RGBA8888
32bppのため、データサイズ大、パフォーマンス低
最も高画質
容量が大きい
55
Tips - #02 適切な画像リソースの作り方(Cocos2d-x編)
Confidential
.pvrコンテナにダイレクトカラーを格納して使う

ダイレクトカラーの以下の形式が格納可能







RGB565
RGBA5551
RGBA4444
結構高画質
UI・アニメ調OK
アルファやヌキは持てない
そこそこ高画質
UI・アニメ調OK
ヌキが持てる
RGB階調が少なく低画質
エフェクト向き
PVRTCやETCにはかなわないが、そこそこ高速
減色ツールを選べば、画質劣化も最小限
Android, iOSで共通に使える
.pvrコンテナ自体は非圧縮だが、.apk や .ipa ファイルでパッケージ化される
ときには圧縮されるので、ダウンロードのサイズはそれほど増えない
56
Tips - #03 2DゲームでPVRTC,ETCを使う場合の注意点







Confidential
PVRTC, ETCは、3Dテクスチャ用に開発された高圧縮フォーマットで、GPUの性能を最大に引き
出すことができる
写真のような画像や、質感を表すようなテクスチャは、PVRTC,ETCともかなり高品質
動きが激しくてエッジやボヤけが気にならない場合は、PVRTC/ETC でも問題ない
UIや、縁取りをはっきりとったアニメ調の絵では、輪郭がぼやけたり、ブロックノイズが発生す
る
ETC はαが使えないので、ゲームでは使える場面が限られる
iOSでは、PVRTCは必ず使用できるが、ETCは使用できない
Androidでは、ETCは必ず使用できるが、PVRTCは一部の機種しか使用できない
PVRTC,ETCについて、おさらい
「圧縮テクスチャ(PVRTC・DXTC・ETC)における
傾向と対策」からダイジェスト
57
テクスチャ形式ごとのbppと圧縮比
テクスチャ形式
Confidential
アルファなし
アルファあり
24bit / 32bitダイレクトカラー
RGB888, RGBA8888
32bpp†
32bpp
16bitダイレクトカラー
RGB565,RGBA4444,RGB5551
16bpp
16bpp
8bitインデックスカラー
8bpp
8bpp
DXTC(S3TC)
4bpp
8bpp
PVRTC 4bpp
4bpp
4bpp
PVRTC 2bpp
2bpp
2bpp
ETC
4bpp
使用不可
bpp : bit per pixel
† VRAM上では32bit必要
サイズ
0
8 16 24 32
58
PVRTC, ETCの画質劣化の注意点
無問題
Confidential
要注意
59
PVRTC
Confidential
オリジナルの画像
60
PVRTC
PVRTC 4bpp
Confidential
滲みを克服することは難しい
61
PVRTCの圧縮・伸長方法
Confidential
1ブロック
(4×4)
Color A
補間
4×4ピクセルを補間色で埋める
(バイリニア)補間を行うので、
隣接ブロックの影響を受ける
62
PVRTCの圧縮・伸長方法
Confidential
Color A, B をそれぞれ、周囲のブロックと補間する
1ブロック
(4×4)
Color A
補間
4×4ピクセルを補間色で埋める
Color B
補間
63
PVRTCの圧縮・伸長方法
Confidential
補間結果のピクセルごとにブレンドする
1ブロック
(4×4)
Color A
Color B
ブレンド方法
1
2
3
2
0
1
2
3
1
0
2
3
1
0
1
2
0
1
2
3
=
=
=
=
A
5/8 A + 3/8 B
3/8 A + 5/8 B
B
復元
ブレンド結果を想定した Color A, B を、
圧縮時に適切に選んでおく必要がある
64
PVRTC 離れていても滲む
Confidential
PVRTC
4bpp
65
PVRTC 離れていても滲む
Confidential
PVRTC
4bpp
PVRTC
4bpp
66
PVRTCのアルファチャンネル
Confidential
• PVRTCはRGBチャンネルに使うビット数を削ってアル
ファチャンネルに配分する
PVRTC
4bpp
RGBのみ
(アルファ無し)
ARGB
(アルファ有り)
RGB
64ビット
RGB
A
代表色
RGB555
1ブロック分の容量
代表色
ARGB3444
両方合わせて64ビット
67
PVRTCのアルファチャンネル
Confidential
• PVRTCではグラデーションをアルファで表現するよりも、
RGBで表現する方が綺麗に表示できる
アルファ有りRGB
無圧縮
PVRTC 2bpp
アルファ有りRGB+背景緑
無圧縮
グラデーションの劣
グラデーションの劣化が
大きい
化が大きい
PVRTC 2bpp
アルファ無しRGB
無圧縮
PVRTC 2bpp
グラデーションの劣化が
ほとんどない
68
ETCのブロックノイズ
Confidential
69
ETCの圧縮方法
Confidential
• 4×4のブロックを2×4のサブブロックに分割する
OR
元画像
70
ETCの圧縮方法
Confidential
• サブブロック毎に代表色を決める
代表色A
RGB444
RGB555
代表色B
71
ETCの理論 (3) 代表色から4色を作る
Confidential
• 代表色に対する輝度の変換テーブルを選ぶ
代表色A
No.0
-8
-2
2
8
No.1
-17
-5
5
17
No.2
-29
-9
9
29
No.3
-42
-13
13
42
No.4
-60
-18
18
60
No.5
-80
-24
24
80
No.6
-106
-33
33
106
No.7
-183
-47
47
183
72
ETCの圧縮方法
Confidential
No.7
代表色A
+183=
0
+47 =
1
-47 =
2
-183=
3
代表色から4色作る時に、輝度
の変化しかできない
73
ETCの圧縮方法
Confidential
ETC
適切な代表色と輝度テーブルの
組み合わせが無い
?
代表色
No.?
輝度テーブル
74
輪郭を入れた例
黒 RGB(0,0,0)や白 RGB(255,255,255)はサブブロック中で
1色としてカウントされないのでジョーカー的に使うことができる。
そのため絵柄がOKであればノイズ低減に利用できる。
Confidential
75
圧縮テクスチャにおける傾向と対策 ダイジェスト
Confidential
詳しくは、こちらをご覧ください
http://cedil.cesa.or.jp/session/detail/1024
76
Confidential
Tips - #04 .pvrファイルをSpriteとして使う方法(Unity)
 Unityエディタ上で .pvrファイルを追加すると、Spriteの作成ができない
(Inspectorの設定項目が無効化されている)
 スクリプトでロードすると、Spriteのテクスチャに.pvrファイルを使用でき
る
var tex = Resources.Load("<FilePath>") as Texture2D;
var texRect = new Rect(0, 0, tex.width, tex.height);
var sprite = Sprite.Create(tex, texRect, new Vector2(0.5f, 0.5f),
100, 1, SpriteMeshType.FullRect)
77
Tips - #05 どの範囲の機種をサポートするべきか
Confidential
 Cocos2d-x は、iOS 5.0以降、Android 2.3以降をサポート
 Unity は、iOS 4.0以降、Android 2.3.1以降をサポート
 サポート範囲を広げると
 低性能機対応のための開発工数増大
 低性能機にあわせたゲーム設計
 ゲームアプリでは、iOS 7以降、Android 4.0以降という割り切りも
78
Tips - #05 どの範囲の機種をサポートするべきか
Confidential
「Unity Hardware Statistics」が役に立つ
http://stats.unity3d.com/mobile/
79
Confidential
Tips - #05 どの範囲の機種をサポートするべきか
80
Confidential
Tips - #05 どの範囲の機種をサポートするべきか
81
Tips - #05 どの範囲の機種をサポートするべきか





Confidential
AppStore のiOSシェアhttps://developer.apple.com/support/appstore/ の結果とほぼ同じ
Android (Google Play)のOSバージョンシェア
http://developer.android.com/intl/ja/about/dashboards/ の結果でも、85%がAndroid 4以
上
上記は全世界の情報なので、日本のユーザーの動向そのものではないことに注意
Google Playにアプリを登録すると、そのカテゴリ(ゲーム、ツールなど)毎のAndroidバージョ
ンのシェア情報が得られるようになる。日本をターゲット市場にしたアプリをリリースしていれ
ば、そこから情報が得られる
Android 3.xの情報が出ていないが、1.0%以下のため。3.xはもともと少なかった上に、バージ
ョンアップで4.xになった機種があるため。3.xは無視して良い。
82
Tips - #06 Androidの画面解像度
Confidential
 Android の画面解像度は多種多様
 Androidの断片化問題のひとつ
 画面解像度にどのように対応するか
83
Tips - #06 Androidの画面解像度
解像度
アスペクト比
Androidの主な解像度一覧(国内発売製品)
320x480
2:3
採用機種少ない
480x800
3:5
Nexus One, Nexus Sで採用。2010~2011には非常に多かった。9:16と10:16の中間
480x854
約9:16
2010~2011には非常に多かった。
540x960
9:16
2011~2012には非常に多かった。
640x960
2:3
600x1024
採用機種少ない
採用機種少ない(一部タブレット)
768x1024
3:4
意外なことに採用機種少ない(iPadの解像度)
720x1280
9:16
Galaxy Nexusで採用。2011末頃~採用多い
768x1280
3:5
800x1280
10:16
1080x1920
9:16
1200x1920
10:16
1440x2560
9:16
1600x2560
10:16
Confidential
Nexus 4で採用。他の搭載機は非常に少ない。9:16と10:16の中間
16:10
1.6
5:3
1.666…
1024x
600
1.706…
16:9
1.777…
Nexus 7(2012)で採用。2011末頃~タブレットそれなりに多い
Nexus 5で採用。2013~現在まで、非常に多い
Nexus 7(2013)で採用。2012~タブレットで多い
採用機種少ない
Nexus 10で採用。2013~タブレットに採用されはじめた
84
Tips - #06 Androidの画面解像度

Confidential
実はiOSのほうがアスペクト比問題は深刻
iPad
4:3
iPhone 4S以前
3:2
iPhone 5以降
約16:9
4:3
1.333…
3:2
1.5
16:10
1.6
5:3
1.666…
iOS
1024x
600
1.706…
Android
16:9
1.777…
85
Tips - #06 Androidの画面解像度
Confidential
86
Tips - #06 Androidの画面解像度
Confidential
 Unity Hardware Statistics では、800x480のシェアが23.8%でトップだ
が、国内ではここまで多くないのではないか
 おそらく、2~4位の1280x720(HD), 1920x1080(FullHD),
1136x640(iPhone5)あたりが主なターゲットのはず
 Android端末一覧 http://ja.wikipedia.org/wiki/Android端末一覧 と併
用すると良い。正確性の保証はないが、概ね正しいはず
87
Tips - #07 カタログスペックと実測値の乖離
Confidential
Xperia arc (SO-01C)
Snapdragon MSM8255 1GHz(1 Core) 480×854 (2011春発売)
AQUOS PHONE SL (IS15SH)
Snapdragon S2 MSM8655T 1.4GHz(1 Core) 540×960 (2012夏発売)
原因は不明

省電力モードを完全にOFFにできないため?

プリインストールアプリの問題?

メーカーのチューニングの差?
Cocos2d-x v2
(バッチなし)
Cocos2d-x v2
(バッチあり)
Cocos2d-x v3
(自動バッチ)
Unity
Xperia arc
27個
24個
36個
30個
AQUOS
PHONE SL
21個
18個
32個
26個
Nexus 5
84個
226個
99個
76個
88
Tips - #08 プロファイラ
•
•
•
•
Confidential
Instruments
Android Debug Monitor
OpenGL ES Trace
Trepn Profiler
89
Tips - #08 プロファイラ
Confidential
Instruments
• OS XやiOSのコードを動的にトレース(動作を追跡)する、定番の性能分析/
テストツール
• TimeProfilerからCPU負荷計測、関数コールのトレースから負荷の高い関数の
特定が短時間で可能
• OpenGL ES Analyzerから実際のドローコールの監視、PowerVRのプリミティ
ブのバッチングの監視も可能
• 日本語情報(少し古い)
https://developer.apple.com/jp/devcenter/ios/library/documentation/InstrumentsUserGuide.pdf
• 英語(最新)
https://developer.apple.com/library/mac /documentation/developertools/Conceptual/InstrumentsUserGuide/
Introduction/Introduction.html
90
Tips - #08 プロファイラ
Confidential
Android Debug Monitor
Android SDKに含まれるプロファイルツール
•
•
•
•
•
•
エミュレータへの着信、電波状態、位置情報制御
スレッドの状態確認が可能
Heap(メモリ)の使用量、使用統計情報
メモリ・アロケーション(メモリ確保)のトラッキング
ファイルエクスプローラ
Javaベースのアプリでは利用価値が高いものの、NDK (C++)ベースの開発では、
関数コールのトレーサーとしてはかなり力不足
91
Tips - #08 プロファイラ
Confidential
Android用のさまざまなプロファイラ
• OpenGL ES Trace
• チップメーカー毎に提供されているツール
• Qualcomm Snapdragon Performance Visualizer
• Qualcomm Trepn Profiler
• PerfHUD
• Mali Graphics Debugger
• Power VR Performance Analysis Utilities
92
Tips - #08 プロファイラ
Confidential
OpenGL ES Trace
OpenGLの呼び出された命令の監視が可能なツールです。
1ループ中の
• 関数の呼び出し順
• 呼び出された関数のカウント
• フレームバッファの状態
• 関数の呼び出しコスト(時間)
等が計測できます。コストについては、参考値程度の信頼性ですが、
OpenGL上でのボトルネックや不要な関数呼び出しの洗い出しに使用できます。
• リアルタイムではなく、いったんログをキャプチャするのがネック
• Android Debug Monitorから起動するとバンドルIDの入力が必要がなく便利
93
Tips - #08 プロファイラ
Confidential
Qualcomm Trepn Profiler
94
Tips - #08 プロファイラ
Confidential
Qualcomm Trepn Profiler
95
最後に
Confidential
手戻りを起こさないためのポイント
• スマートフォンは、機種による性能差が非常に大きい
• エンジンによる性能差は、それに比較すれば小さいほ
うなので、目的にあったものを選択すべし
• ベンチマークは重要。ただし、ピーク値に注意
• 適切な画像リソースを使おう
• プロファイラを使おう
96
Confidential
ご清聴ありがとうございました。
97