工程の手戻りを最小限に 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
© Copyright 2024 ExpyDoc