Weitere ähnliche Inhalte Ähnlich wie DeNA流cocos2d xとの付き合い方 (20) DeNA流cocos2d xとの付き合い方1. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
DeNA流流
cocos2d-‐xとの付き合い⽅方
[20-‐‑‒D-‐‑‒6]
株式会社ディー・エヌ・エー
Japanリージョン
ゲーム事業本部
技術・編成部
開発基盤グループ
惠良良
和隆
kazutaka.era@dena.com
2. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
⾃自⼰己紹介
! 惠良良和隆(えら
かずたか)
⁃ 2002年年
株式会社フロム・ソフトウェア⼊入社
• コンソールゲームの開発(クライアント、サーバー)
• ライブラリ、フレームワークの開発
• 開発環境構築
• etc
⁃ 2013年年10⽉月
株式会社ディー・エヌ・エー⼊入社
• ゲームアプリ開発に必要なライブラリやフレームワーク、
サーバーなどの開発するグループに所属
• ゲーム開発のワークフロー整備
• cocos2d-‐‑‒xをベースとした社内ゲームエンジンの開発
• ゲームシステムのアーキテクチャアドバイザー
• etc
3. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
アジェンダ
! cocos2d-‐‑‒xとは?
! OSSと独⾃自拡張
! cocos2d-‐‑‒xを使ったDeNA内製エンジン
⁃ Kickmotor
⁃ LiftEngine
! 今後の展望
5. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
cocos2d-‐xとは?
! Open
Source
⁃ MITライセンス
! 2Dグラフィックスに特化したゲームエンジン
⁃ 3Dグラフィックスのための機能も実装され始めた
! ほとんどC++で書かれている
! OpenGL(ES)で描画
! マルチプラットフォーム対応
⁃ モバイル:iOS/Android/WindowsPhone
⁃ デスクトップ:Windows/Mac
OS
X
! 今の最新バージョンは、3.4
or
2.2.6
! 詳しくは以下を参照
⁃ http://www.cocos2d-‐‑‒x.org/products#cocos2dx
6. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
cocos2d-‐xを使うメリット
! C++でゲームを実装
⁃ 複雑な処理理でも実⾏行行速度度が低下しにくい
! すべてのソースコードにアクセスできる
⁃ 何か問題が起きても⾃自分で対応できる
⁃ 拡張し放題
! マルチプラットフォーム対応
⁃ スマホアプリならiOS/Androidへの両⽅方に対応したい
⁃ 全部⾃自分で作れなくも無いけど⼤大変
! 市井のツールを利利⽤用しやすい
⁃ SpriteStudio
⁃ Spine
⁃ CocosBuilder
8. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Unityじゃだめなの?
! だめじゃない
⁃ Unityでも2Dゲームは作れる
⁃ だけど・・・
! 凝ったことをやろうとすると、ネイティブ実装が必要になる
⁃ 複雑で重い処理理
⁃ 特殊なネイティブAPI
! ゲーム開発者は凝ったことをやりたがる
⁃ 汎⽤用な機能で特殊な要件には対応しづらい
⁃ ⼤大抵はパフォーマンスの問題に発展
! ある程度度の技術⼒力力と⼯工数があるのであれば
独⾃自拡張出来るOSSゲームエンジンの魅⼒力力は⼤大きい
⁃ それなりに⼤大変だけど・・・
10. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
独⾃自拡張
! OSSを利利⽤用する最⼤大の理理由
! ⾃自分たちの要件に合わせてカスタマイズ
⁃ ⾼高度度で複雑な機能
⁃ ⾼高い実⾏行行効率率率
⁃ プラットフォームが提供する機能
⁃ 技術競争⼒力力をアドオン出来る
! バグが⾒見見つかっても⾃自分で治せる
⁃ 特殊な条件でしか発⽣生しない不不具合も多数ある
⁃ OSSでも潜在バグは多々ある
ただし、独⾃自拡張は諸刃の剣
11. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
独⾃自拡張のデメリット
! オリジナルの進化を取り込み⾟辛くなる
⁃ ⾃自分たちの更更新とオリジナルの更更新が⼲干渉
⁃ 場合によっては⼿手作業でのマージが必要になる
⁃ 更更新が頻繁なものほど取り込むための⼿手間が⼤大きくなる
! どのように対応するか?
⁃ ある程度度安定したバージョンを使⽤用する
⁃ 本当に必要な時だけオリジナルの更更新を取り込む
⁃ 不不具合修正などだけCherry
Pickする
⁃ オリジナルの流流れと決別する
おそらく、cocos2d-‐x
2系を使う理理由のほとんどはコレ
13. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Kickmotor
! WebViewとcocos2d-‐‑‒xを組み合わせたハイブリッドアプリ開発⽤用フ
レームワーク
! cocos2d-‐‑‒x上に構築した独⾃自アニメーションエンジンによるリッチな演
出機能と、WebViewによるコンテンツ更更新性を両⽴立立させる
! ネイティブ実装されたキャッシュ機構によりダウンロード量量を削減
! 様々な外部SDKも組み合わせてより⾼高機能に
! 採⽤用タイトル
⁃ D.O.T.
⁃ 三国志ロワイヤル
⁃ FINAL
FANTASY
Record
Keeper
14. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
ネイティブ
キャッシュ
WebView・ネイティブブリッジ
Kickmotorのアーキテクチャ
iOS/Android
ネイティブ
アニメーション
他SDK
cocos2d-‐x
WebView
ゲーム
15. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Kickmotorのレイヤー構造
! WebViewの上にcocos2d-‐‑‒xのOpenGLレイヤーを重ねている
⁃ OpenGLレイヤーは必ずα=0でクリアされる
WebView Layer
透過OpenGL Layer
16. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Kickmotorにおけるcocos2d-‐x拡張
! ベースバージョンは、2.1系
! デザイナが表現したいものを作れるように拡張
⁃ CCNodeがRGBとα値を伝搬可能に
⁃ アンカーポイント設定が⼦子ノードの座標に影響しないように修正
⁃ 独⾃自のキーフレームアニメーション実装
• ⾊色、α、サイズ、位置、スケール、向き、テクスチャ、UV、etc
⁃ 独⾃自のパーティクルシステム実装
• MotionStreak
• ゆらぎ
• Attractor
! 様々な最適化
⁃ ⾃自動スプライトバッチ描画
⁃ シーングラフトラバースの負荷を下げる⼯工夫
17. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Kickmotorにおけるcocos2d-‐x拡張
! ほとんどがcocos2d-‐‑‒xの作法に則った拡張
⁃ 派⽣生クラスを実装することで機能拡張
! オリジナルコードに対する修正は少ない
⁃ 今のところは・・・
⁃ 最適化すればするほど修正量量は増える
! OpenGL描画に関連しない機能は、WebView・ネイティブブリッジで
実装されるため、cocos2d-‐‑‒x⾃自体にはそれほど⼿手が加えられていない
⁃ 動画再⽣生
⁃ Facebook/Twitter連携
⁃ 課⾦金金
⁃ Crittercism
⁃ etc
18. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Kickmotorの参考資料料
! http://cedil.cesa.or.jp/session/detail/1047
! http://www.slideshare.net/dena_̲study/20141111-‐‑‒dena-‐‑‒study21
! http://next.rikunabi.com/tech/docs/ct_̲s03600.jsp?
p=002421&tcs=pickup
19. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engine
! cocos2d-‐‑‒xをベースとする2Dゲームエンジン
! 市井のツールを活⽤用出来るようにcocos2d-‐‑‒xの基本仕様は維持
! ⾼高パフォーマンス
! ⾼高い表現⼒力力
! アプリ開発を効率率率化するための各種機能
! マルチスレッドによる各種⾮非同期APIの実装
! 内製サウンドエンジンDeAL
! アプリケーション開発者はcocos2d-‐‑‒xを意識識しない
! ネイティブアプリ開発経験の少ない開発者のお⼿手本としての実装
⁃ ゲーム本体もC++で実装する
20. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engine採⽤用タイトル
! パズル戦隊デナレンジャー(近⽇日リリース予定)
21. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! cocos2d-‐‑‒xの基本仕様は維持
⁃ SpriteStudio、CocosBuilderなどのツールを活⽤用出来る
⁃ パズル戦隊デナレンジャーでもこれらのツールを活⽤用
! ⾼高パフォーマンス
⁃ C++実装レベルでの無駄を徹底的に除去
⁃ 独⾃自実装された⾃自動スプライトバッチ描画機能
⁃ ピクセルフィルの負荷を下げるための機能
⁃ シェーダ最適化
⁃ SpriteStudioの再⽣生エンジンも完全独⾃自実装
22. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! 独⾃自実装された⾃自動スプライトバッチ描画機能
⁃ CocosBuilder等で作られたデータでもバッチ描画される
多くのスプライトが
1回のどローコールで
描画されているが、
CocosBuilder上では特
に設定する必要なし
23. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! ピクセルフィルの負荷を下げるための機能
⁃ 静的な背景描画を1つのテクスチャに焼きこんで、1つのスプライ
ト描画にまとめる
• CCRenderTextureを活⽤用するための機能
• テクスチャの⽣生成は⼀一回⽬目の描画のみ
⁃ glClearを呼ばない
• 背景画像を描画するので無意味
! シェーダ最適化
⁃ cocos2d-‐‑‒xに含まれるシェーダは物凄くシンプルで
最適化する余地はほとんどない
⁃ 外部ライブラリで実装されたシェーダが重い
• 動的分岐をカジュアルに使⽤用
24. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! SpriteStudioの再⽣生エンジンも完全独⾃自実装
⁃ 標準プレイヤーが重すぎる
• バッチ描画出来ないパターンが多い
⁃ カラーブレンドや頂点アニメーションが使⽤用されている場合
⁃ cocos2d-‐‑‒x標準のバッチ描画機能が使えない際にはバッチ描画されない
• SpriteStudio専⽤用のカスタム仕様CCSpriteBatchNodeを実装
⁃ カラーブレンドや頂点アニメーションがあってもバッチ描画できる
• シェーダが重い
⁃ 三項演算⼦子を3つも使⽤用している!
⁃ 動的分岐を排除し、できるだけ頂点シェーダで処理理するように
標準プレイヤーに対して10倍以上の⾼高速化を実現!
25. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! SpriteStudioの再⽣生エンジンも完全独⾃自実装
! エフェクト系アニメーションで多⽤用されるαブレンドの多⽤用がバッチ描画を阻害
αブレンド設定:A
αブレンド設定:B
αブレンド設定:B
αブレンド設定:A
描画順序は下から上
パーツ0
パーツ1
パーツ3
パーツ2
αブレンド設定の異異なるスプライト描画が交互に来るので、
1つのドローコールに纏められない
26. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! パズルゲームでは以下のようなレイアウトもあり得る
ドローコールが
100になる!
27. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! SpriteStudioの並列列描画機能
25個のパーツ3
25個のパーツ2
25個のパーツ1
25個のパーツ0
描画順序
28. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! SpriteStudioの並列列描画機能
25個のパーツ3
25個のパーツ2
25個のパーツ1
25個のパーツ0
描画順序
ドローコール数が
100
→
4
に!
29. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! SpriteStudioの並列列描画機能
⁃ 並列列描画グループノードを作成
• 配下のSpriteStudio描画が⾃自動的に並列列描画される
※この並列列描画のアルゴリズムは特許出願中
30. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! ⾼高い表現⼒力力
⁃ Kickmotorでも使われたアニメーションエンジンの最新バージョン
の実装
• ⾼高度度なパーティクルエンジン
• 様々なアニメーション表現
⁃ SpriteStudioで作成されたアニメーションを⼤大量量表⽰示可能
• 標準プレイヤー⽐比で数倍〜~数⼗十倍の性能
⁃ 拡張されたTrueTypeフォントラベル
• XMLタグ指定によって動的にラベルプロパティを変更更可能
• 1つのラベルで下のような表現が可能
1つのラベルの中でサイズを⼤大きくしたり⾊色を変えたりできます
1つのラベルの中で<aUr
size=‘24’>サイズを⼤大きく</aUr>したり
<aUr
color=‘FF0000’>⾊色を変えたり</aUr>できます
31. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! アプリ開発を効率率率化するための機能
⁃ 独⾃自メモリ管理理機構
• メモリリーク
• バッファオーバーラン、解放後メモリ書き込みの検出
⁃ デバッグメニュー
• アプリケーション毎に拡張が⽤用意なタッチ操作のためのデバッグメニュー
⁃ ⾼高度度なロギング機能
• OSSのロギングライブラリを組み込み
⁃ 動的なアセット更更新を可能にするファイルサーバー機能
⁃ プロファイル機能
• カテゴリ毎に独⽴立立して計測
• 計測区間の重複があっても正しく計測
32. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! 独⾃自メモリ管理理機構
⁃ メモリの確保、解放をすべて独⾃自のAPIに置き換え
• Instrumentsが使えない場合のメモリリーク検出機構
• メモリ確保・解放⽤用マクロを⽤用意
⁃ メモリの確保場所(ソースファイルパス、⾏行行番号)を特定したい
⁃ global
new/deleteの置き換えでは不不⾜足
⁃ 確保メモリの前後に緩衝領領域を配置
• オーバーランしていないか判定(書き込み系のみ)
⁃ メモリ破壊を検出するために、メモリ解放を遅らせる機能
1. アプリケーションが解放したタイミングでメモリフィルし、
解放待ちキューに登録
2. 解放待ちキューの⻑⾧長さが⼀一定以上になるとキューの先頭から順次解放処理理
3. 解放処理理時にメモリフィルした内容が書き換えられていないかチェック
33. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! デバッグメニュー
⁃ コンソールゲーム開発では良良くある機能
⁃ 開発中に必要な特殊操作を⾏行行うためのメニューを表⽰示
⁃ ただし、ゲームプレイを邪魔してはならない
この部分
普段は⾒見見えない
34. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! ⾼高度度なロギング機能
⁃ cocos2d-‐‑‒xのログは基本的にprintfのみ
⁃ カテゴリ毎にログ出⼒力力のON/OFFを制御したい
⁃ PCに接続しない状態で実⾏行行している時のログを
ファイルに保存したい
⁃ log4cplusを導⼊入
• 開発中ビルドでのみ使⽤用
! 動的なアセット更更新を可能にするファイルサーバー機能
⁃ WiFi経由で端末側アプリ・PC間でファイルのやりとりを⾏行行う
⁃ データ確認のためにipa/apkを更更新しなくても良良い
⁃ USBでの接続、外部サーバー経由での接続の仕組みも検討中
35. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! プロファイル機能
⁃ cocos2d-‐‑‒xのCCProfilerは⽂文字列列をキーとして区間集計するが、
計測区間が重複していることを考慮していない
⁃ カテゴリAの計測区間の中に別のカテゴリB、Cの計測区間がある場
合、下図のように重複して計測しないようにする機能を独⾃自実装
⁃ カテゴリ毎に集計されたプロファイル結果は、画⾯面上に⽂文字もしく
はパフォーマンスゲージとして常に表⽰示
36. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! プロファイル機能
数字による表⽰示
ゲージによる表⽰示
37. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! マルチスレッドによる各種⾮非同期APIの実装
⁃ cocos2d-‐‑‒xのリソース読み込みはほとんどが同期読み込み
• ファイル読み込みが⾛走るとゲームが⼀一瞬⽌止まる
⁃ 独⾃自スレッドで読み込み処理理を⾏行行うリソース読み込み機能の実装
⁃ 汎⽤用的な⾮非同期処理理実装のための仕組みと、⾮非同期処理理待ち合わせ
のための仕組みを提供
⁃ cocos2d-‐‑‒xはスレッドセーフではないため、必要なところは個別に
スレッドセーフ化
⁃ マルチスレッド実装のための各種APIラッパー
• アプリケーションがpthreadなどのAPIを直接使わない
38. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! 内製サウンドエンジンDeAL
⁃ cocos2d-‐‑‒x標準のサウンド機能は貧弱
• iOSとAndroidで実装が全然違う
⁃ ゲームの演出要素としてコンソールゲーム並のサウンド演出を⼊入れ
るためには機能が全然⾜足りない
⁃ ⾃自分たちの要件に合わせて機能を拡張できるように独⾃自実装
⁃ WAV/Ogg
Vorbis/Opusなどのフォーマットに対応
⁃ SEの種類毎にボリュームや同時発⾳音数を設定可能
⁃ ストリーム再⽣生、オンメモリ再⽣生、デコード済みオンメモリ再⽣生
⁃ ミキサー機能
⁃ 2D/3D
Panning機能
⁃ BGMのポイントループ再⽣生
39. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineの特徴
! アプリケーション開発者はcocos2d-‐‑‒xを意識識しない
⁃ ゲームを作る上で必要な基本機能を提供
⁃ cocos2d-‐‑‒xの使いにくいところ、実装の⼿手間が増えるところを
カバーするための機能を多数提供
• 暗号化(ファイル、メモリ)
• GUIコンポーネント
• ローカル通知
• テキスト⼊入⼒力力ダイアログ
• クリップボード操作
• WebView表⽰示
• 動画再⽣生
! ネイティブアプリ開発経験の少ない開発者のお⼿手本としての実装
⁃ 豊富なコメント
⁃ シンプルで⾒見見通しの良良い実装
40. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Li7
Engineにおけるcocos2d-‐x拡張
! ベースバージョンは、2.2系
! ほぼすべてのソースファイルが書き換えられている
⁃ new/delete、malloc/freeの置き換え
⁃ コード最適化
⁃ 使わない機能の除去(⾃自分たちが絶対に使わないコードの除去)
⁃ ログ出⼒力力置き換え
⁃ 64bit対応(iOS)
⁃ 様々な機能追加
! cocos2d-‐‑‒xの2.2系はすでに枯れていて⼤大きな機能追加は無い
⁃ どうしても取り込みたい修正だけCherryPick
41. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
今後の展望
! 今後もcocos2d-‐‑‒x
2系を拡張し続ける
⁃ Lift
EngineだけでなくKickmotorも継続的に進化していく
! Lift
Engineは、より積極的に拡張し続ける
⁃ ゲーム開発をより効率率率化するための拡張
• より効率率率的にTry&Errorするための仕組み
• スクリプトエンジンの導⼊入
⁃ cocos2d-‐‑‒x
+
Lua
ではなく、使⽤用⽅方法を限定した形とすることで
パフォーマンス低下を防ぐ
⁃ さらなる最適化
• テクスチャのランタイムパッキング
⁃ さらなる表現⼒力力
• 3D描画機能
⁃ ⽤用途を明確にした機能を実装する
42. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
今後の展望
! cocos2d-‐‑‒x
3系への置き換え
⁃ ⼤大きなメリットがあれば
⁃ ほとんどは機能の取り込みで対応できると予想
⁃ ベースとなる技術が枯れていることは重要
⁃ 今のところ3系に置き換える必要性を感じていない
43. Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
まとめ
! DeNAではcocos2d-‐‑‒xを積極的に活⽤用
! Kickmotorはアニメーション表現に特化したcocos2d-‐‑‒xの拡張を適⽤用
! cocos2d-‐‑‒xをベースにしたLift
Engineを新規開発した
! ゲームの要件に合わせた機能拡張は躊躇せずどんどんやる
! 今後もKickmotor/Lift
Engineのcocos2d-‐‑‒xも独⾃自の進化を遂げる