cedec 2015 cocos2d-x と社内基盤の付き合い方...
TRANSCRIPT
Copyright Drecom Co., Ltd. All Rights Reserved. 1
Cocos2d-x と社内基盤の付き合い方~アップストリームファーストを目指して~
株式会社ドリコム高橋成人木元将輝
Copyright Drecom Co., Ltd. All Rights Reserved. 4
痩せたこともありました
photo by Hometown Beauty
痩せちゃうこともありました
Copyright Drecom Co., Ltd. All Rights Reserved. 8
アップストリームへの道のりの話
photo by Kevin Dinkel
今日の話はアップストリーム開発
へ至る道のり
Copyright Drecom Co., Ltd. All Rights Reserved. 9
目的
lCocos2d-x のアップストリーム開発を採用した理由を展開
l他の方がどう付き合っていっているか共有したい
Copyright Drecom Co., Ltd. All Rights Reserved. 10
Agenda
lモバイルゲームと社内基盤l次の社内基盤lオープンソースとの付き合い方lCocos2d-x を利用する
Copyright Drecom Co., Ltd. All Rights Reserved. 11
Agenda
lモバイルゲームと社内基盤l次の社内基盤lオープンソースとの付き合い方lCocos2d-x を利用する
Copyright Drecom Co., Ltd. All Rights Reserved. 15
bisque 以前のネイティブ開発環境
liOS- Cocos2d-iphone
lAndroid- Cocos2d-android
Copyright Drecom Co., Ltd. All Rights Reserved. 16
bisque 以前のネイティブ開発環境(2)
l言語が違う- Objective-C- Java
l開発効率が良くない
Copyright Drecom Co., Ltd. All Rights Reserved. 22
Cocos2d-x の長所と短所
ゲーム以外の機能
ほぼゼロレイヤ階層
レンダリング
画像フォーマットの表示
ゲーム機能に特化
Copyright Drecom Co., Ltd. All Rights Reserved. 23
短所を補う
UIウィジェット
速度
アプリ内課金
暗号処理
サウンド・システム
演出
足りない
未熟レイヤ階層
レンダリング
画像フォーマットの表示
ゲーム機能に特化
Copyright Drecom Co., Ltd. All Rights Reserved. 25
bisqueで担保
足りないもの
UIウィジェット速度
アプリ内課金暗号処理
足りないもの
足りないもの
サウンドシステム演出
未熟なもの 足りないものUX向上
足りないもの
切り札
WebView
Copyright Drecom Co., Ltd. All Rights Reserved.
Copyright Drecom Co., Ltd. All Rights Reserved. 26
崖っぷちバスターズ® で利用しています崖っぷちバスターズ®は、壁を壊して、敵を崖から突き落す、新感覚のぶっ放し協力バトルゲームです。GPS連動したエリアバトルでスコアランキングを競い、エリアNo.1になることで、そのエリアを制圧しながら拡大していくことができます。また、最大4人で遊べるマルチプレイ機能を搭載!仲間と連携して必殺技を繰り出せば、敵に大ダメージを与えることができます。手に汗握るバトルが繰り広げられる、「みんなで遊べるゲーム」の決定版です。
Copyright Drecom Co., Ltd. All Rights Reserved. 27
Bisque の目的
lネイティブシフト- ◯ ネイティブアプリのリリース
lネイティブ環境の整備- ◯ Cocos2d-x でコスト削減- ◯ 足りない機能は追加
Copyright Drecom Co., Ltd. All Rights Reserved. 29
新たなる要望
利用する機能を選びたい
ライセンス未使用 3rd party libは表記を避けたい
1
パーミッション未使用機能の許可を避けたい
パッケージサイズのシェイプアップ少しでもサイズを減らしたい
Copyright Drecom Co., Ltd. All Rights Reserved. 30
新たなる要望
ゲーム以外のアプリでの活用暗号化処理のみを利用したい
2
Cocos2d-x を新しくしたいv2.0.4 は既に3年前(!)
3
Copyright Drecom Co., Ltd. All Rights Reserved. 31
• UIWidgetというのができた• レンダリング性能の向上• 3D 演出の追加• C++11
Cocos2d-x の状況
v2 v3
新しい演出や体験• 古い• 情報自体がもう少ない
• 開発スピード低下
Copyright Drecom Co., Ltd. All Rights Reserved. 32
状況整理
機能選択
ゲーム以外のアプリで利用
バージョンアップ
機能全部載せ×
Cocos2d-x付のコードを含んだバイナリ△
バージョン v2.0.4 固定×
Copyright Drecom Co., Ltd. All Rights Reserved. 33
Agenda
lモバイルゲームと社内基盤l次の社内基盤lオープンソースとの付き合い方lCocos2d-x を利用する
Copyright Drecom Co., Ltd. All Rights Reserved. 35
現状の bisque 構成
lbisque ソースファイル- Cocos2d-x の proj ファイルで管理
lbisque 機能- ソースコードはモジュール化済み- ビルド周りは一枚岩状態- 機能選択はできるが、ちょっと面倒
Copyright Drecom Co., Ltd. All Rights Reserved. 36
bisque 機能の分離
課金 sqlite3
サウンド 暗号処理
bisque
core
v2.0.4
Copyright Drecom Co., Ltd. All Rights Reserved. 37
bisque 機能の分離(2)
l機能の分離- 必須機能を Core 化- 選択可能機能をモジュール化
lBisque の Core 部分と機能毎にproj ファイルを用意
l欲しい機能だけ選べる
Copyright Drecom Co., Ltd. All Rights Reserved. 38
Cocos2d-x からの独立
課金 sqlite3
サウンド 暗号処理
bisque
v2.0.4
core
Copyright Drecom Co., Ltd. All Rights Reserved. 39
Cocos2d-x からの独立(2)
lBisque Core の proj ファイルを別管理
lCocos2d-x と分離し、bisque と Cocos2-d x を同列モジュール化にした
Copyright Drecom Co., Ltd. All Rights Reserved. 42
モジュール化
lbisque core と Cocos2d-x を同列モジュール化し、対等な立場へ
lbisque 内でも一部機能をサブモジュールとして選択できるようにした。
Copyright Drecom Co., Ltd. All Rights Reserved. 43
例: sqlite3 使わないよ
課金 sqlite3
サウンド 暗号処理
bisque
core
v2.0.4
Copyright Drecom Co., Ltd. All Rights Reserved. 45
例: 暗号処理だけ使いたいよ
課金 sqlite3
サウンド 暗号処理
bisque
core
v2.0.4
Copyright Drecom Co., Ltd. All Rights Reserved. 49
Cocos2d-x と疎結合になったので…
課金 sqlite3
サウンド 暗号処理
bisque
v2.0.4
core
Copyright Drecom Co., Ltd. All Rights Reserved. 51
例: 大変そうだけどもこういうのもあり
課金 sqlite3
サウンド 暗号処理
bisque
core
Copyright Drecom Co., Ltd. All Rights Reserved. 52
フレームワークの選択肢が広がる!!
課金 sqlite3
サウンド 暗号処理
bisque
core
Copyright Drecom Co., Ltd. All Rights Reserved. 53
もちろんバージョンアップも楽に!
課金 sqlite3
サウンド 暗号処理
bisque
v3.x
core
Copyright Drecom Co., Ltd. All Rights Reserved. 54
コンセプト
機能選択
ゲーム以外のアプリで利用
バージョンアップ
サブモジュール化で利用機能を選択可能に◯
バージョン v2.0.4 固定×
bisque 独立により必要最低限のバイナリ◯
Copyright Drecom Co., Ltd. All Rights Reserved. 55
残りタスク
機能選択
ゲーム以外のアプリで利用
バージョンアップ
◯
バージョン v2.0.4 固定×
サブモジュール化で利用機能を選択可能に
bisque 独立により必要最低限のバイナリ◯
Copyright Drecom Co., Ltd. All Rights Reserved. 57
Cocos2d-x バージョン要望
EngRD RD
バージョン固定したい
運用中アプリの安定化
最新を使いたい
最新機能の調査
すべてのバージョン
アプリ開発者へ機能提供
Copyright Drecom Co., Ltd. All Rights Reserved. 59
バージョン選択が必要だ
機能選択
ゲーム以外のアプリで利用
バージョン選択
◯
バージョン v2.0.4 固定×
サブモジュール化で利用機能を選択可能に
必要最低限のバイナリ◯
Copyright Drecom Co., Ltd. All Rights Reserved. 60
バージョン選択要件
l全バージョンを選択できる
l全バージョンに自社機能を簡単に入れられる
l上記2つを低コストで実現できる
Copyright Drecom Co., Ltd. All Rights Reserved. 61
バージョン選択状況
lCocos2d-x のメインストリームは常に変化し続ける
lCocos2d-x のソースコードを変更するとバージョンアップ時に支障をきたす
lかと言って変更しないわけには…
Copyright Drecom Co., Ltd. All Rights Reserved. 63
あるんです
Copyright Drecom Co., Ltd. All Rights Reserved.
Copyright Drecom Co., Ltd. All Rights Reserved. 64
Linux
Copyright Drecom Co., Ltd. All Rights Reserved.
• オープンソース(GPL v2)• 複数アーキテクチャ対応• 世界で最も成功している OSS プロジェクトの一つ
Copyright Drecom Co., Ltd. All Rights Reserved. 65
Linux
Copyright Drecom Co., Ltd. All Rights Reserved.
リリース間隔2~3ヶ月
変更コード200万行以上
参加企業200社以上
アップストリーム開発
Copyright Drecom Co., Ltd. All Rights Reserved. 66
Agenda
lモバイルゲームと社内基盤l次の社内基盤lオープンソースとの付き合い方lCocos2d-x を利用する
Copyright Drecom Co., Ltd. All Rights Reserved. 67
アップストリーム開発
オープンソースソフトウェアに対して企業が行ったソースコード修正を元のオープンソースプロジェクトに還流させるプロセス
アップストリームファーストは還流を第一優先で考えること
Copyright Drecom Co., Ltd. All Rights Reserved. 69
アップストリーム開発
自社特有の処理は自社でメンテナンスし汎用化可能なソースコードを還流する
リリースを追いながら自社の処理も追加できる開発手法
Copyright Drecom Co., Ltd. All Rights Reserved. 70
アップストリーム開発
修正を還流するためメインストリームの最新を追いかける必要があり、バージョン変更のコストを下げるのが必須になる
バージョン変更のコストを抑えられる
Copyright Drecom Co., Ltd. All Rights Reserved. 72
自社でメンテナンス
l追加した処理をメンテし続ける
lアップストリームが verup- 自社の変更点をすべて移行- 時間がたつほど移行対象が増える
lこれはうまく行った例
Copyright Drecom Co., Ltd. All Rights Reserved. 74
自社でメンテナンス(3)
lバージョンアップがうまくいくとは限らない
l同じバージョンを使い続ける可能性も…
lバージョンアップは新しいフレームワークを作成する時
Copyright Drecom Co., Ltd. All Rights Reserved. 75
自社でメンテナンス(4)
lメリット- 変更のスピードが速い- やりたい放題
lデメリット- 変更すればするほど verup が困難- 独自フレームワーク化- 新機能が利用できない
Copyright Drecom Co., Ltd. All Rights Reserved. 77
アップストリーム開発(2)
l自社の処理をメインラインへ還流
l対象プロジェクトが verup- 最小限の自社の変更点を移行- 移行対象は減らせる
Copyright Drecom Co., Ltd. All Rights Reserved. 78
アップストリーム開発(3)
l新機能を利用可能
l最新版を追える状況になる
lバージョンアップは Cocos2d-x を利用する過程でしかない
Copyright Drecom Co., Ltd. All Rights Reserved. 79
アップストリーム開発(4)
lメリット- 最新版を追いやすい- 新機能が利用可能- (受け入れられれば)メンテコスト減
lデメリット- 追い続けなければいけない- 反映されるまで遅い(保障もなし)
Copyright Drecom Co., Ltd. All Rights Reserved. 81
アップストリーム開発採用判断基準
lオープンさ
l機能追加の頻度
lプロジェクトの熱量
lスポンサー
Copyright Drecom Co., Ltd. All Rights Reserved. 82
はどう?
オープンさどうして?プロジェクトの進捗が見えるのでプロジェクトの方向性を見通しやすい。そのため追いかけやすい環境になる。
Trello でリリースのロードマップ提示github 上で進捗管理オープンさは十分
Copyright Drecom Co., Ltd. All Rights Reserved. 83
はどう?
追加機能の頻度どうして?機能追加があるからこそアップストリームを追う利点がある。追加機能がないのであれば追う必要はない。
バージョンアップ時に5~10万行追加新機能・新プラットフォームの対応最新版を追う利点はある
Copyright Drecom Co., Ltd. All Rights Reserved. 84
はどう?
プロジェクトの熱量どうして?参加する開発者が多いことで機能追加の勢いや品質の高さにも影響する。
github の Pull Request が 100件以上Cocos2d-x のフォーラムも活発
Copyright Drecom Co., Ltd. All Rights Reserved. 85
はどう?
スポンサーどうして?実績がないと契約されない。(お金👌の関係 is シビア)安定したプロダクト運用を要求される。数が多いに越したことはない。
SoC メーカから携帯端末メーカ、パブリッシャーまでスポンサー、パートナーシップを組んでいる。
Copyright Drecom Co., Ltd. All Rights Reserved. 88
Cocos2d-x と付き合うブランチ戦略(2)
lgithub から clone, pull してリポジトリを同期する
l自社ブランチをリリースタグから作成、変更点追加
l前ブランチから変更点を merge
lリリース毎に繰り返す
Copyright Drecom Co., Ltd. All Rights Reserved. 89
ブランチ戦略の利点
lgithub と同期しながら変更点を自社で管理し続けられる
lgit リポジトリが同期しているので Cocos2d-x メインストリームへ送付する Pull request 作成が低コストになる
Copyright Drecom Co., Ltd. All Rights Reserved. 90
アプリケーションでの利用方法
アプリ自社gitlab
Classes
Resources
proj 群
cocos2d submodule v3.3v3.4v3.5
Copyright Drecom Co., Ltd. All Rights Reserved. 91
アプリケーションでの利用方法(2)
lアプリ内の Cocos2d-x ディレクトリを git サブモジュールとして扱う
l利用したいバージョンのブランチを指定する
Copyright Drecom Co., Ltd. All Rights Reserved. 92
この利用方法の利点
lアプリケーション側で利用するCocos2d-x のバージョン変更が気軽になる。
lアプリケーションを開発しつつCocos2d-x のソース修正が可能Pull Request 作成が低コストになる
Copyright Drecom Co., Ltd. All Rights Reserved. 93
アップストリーム開発を採用したので
lCocos2d-x の最新版が利用可能
lバージョンも利用可能な土壌が出来上がった。
l変更を還流するので社外の人もハッピー(になる予定)
Copyright Drecom Co., Ltd. All Rights Reserved. 94
バージョン選択
アップストリームでバージョン選択可能に◯
コンセプト
機能選択
ゲーム以外のアプリで利用
◯サブモジュール化で利用機能を選択可能に
◯bisque 独立により必要最低限のバイナリ
Copyright Drecom Co., Ltd. All Rights Reserved. 95
Agenda
lモバイルゲームと社内基盤l次の社内基盤lオープンソースとの付き合い方lCocos2d-x を利用する
Copyright Drecom Co., Ltd. All Rights Reserved. 99
・C++11準拠
・3D機能
・描画処理
・ローカルストレージ機能
・スクリプト関連
・C++11準拠
Copyright Drecom Co., Ltd. All Rights Reserved. 100
・C++11準拠
・3D機能
・描画処理
・ローカルストレージ機能
・スクリプト関連
・3D機能
Copyright Drecom Co., Ltd. All Rights Reserved. 101
・C++11準拠
・3D機能
・描画処理
・ローカルストレージ機能
・スクリプト関連
・描画処理
Copyright Drecom Co., Ltd. All Rights Reserved. 102
・C++11準拠
・3D機能
・描画処理
・ローカルストレージ機能
・スクリプト関連
・ローカスストレージ機能
Copyright Drecom Co., Ltd. All Rights Reserved. 103
・C++11準拠
・3D機能
・描画処理
・ローカルストレージ機能
・スクリプト関連・スクリプト関連
Copyright Drecom Co., Ltd. All Rights Reserved. 104
・C++11準拠
・3D機能
・描画処理
・ローカルストレージ機能
・スクリプト関連 他にも色々
FileUtil
Font
MathLib
3D Socket
MySQL
ScriptBind
Copyright Drecom Co., Ltd. All Rights Reserved. 105
・C++11準拠
・3D機能
・描画処理
・ローカルストレージ機能
・スクリプト関連
・描画処理
Copyright Drecom Co., Ltd. All Rights Reserved. 106
Director
drawScene()
Scene
addChild()
visit()
Sprite
visit()
draw()
OpenGL ES API
glDrawArrays()version2
Copyright Drecom Co., Ltd. All Rights Reserved. 107
Director
drawScene()
render()
Scene
addChild()
visit()
render()
Sprite
visit()
draw()
Renderer
addCommand()
render()
drawXXXX()
OpenGL ES API
glDrawElements()
version3
Copyright Drecom Co., Ltd. All Rights Reserved. 108
Director
drawScene()
render()
Scene
addChild()
visit()
render()
Sprite
visit()
draw()
Renderer
addCommand()
render()
drawXXXX()
OpenGL ES API
glDrawElements()
RenderCommand
RenderCommand
version3
Copyright Drecom Co., Ltd. All Rights Reserved. 109
Director
drawScene()
render()
Scene
addChild()
visit()
render()
Sprite
visit()
draw()
Renderer
addCommand()
render()
drawXXXX()
OpenGL ES API
glDrawArrays()
glDrawElements()
RenderCommand
RenderCommand
version2version3
Copyright Drecom Co., Ltd. All Rights Reserved. 111
・Draw Callに関する変更
・基本的にglDrawArraysはglDrawElementsへ変更
Copyright Drecom Co., Ltd. All Rights Reserved. 112
・Draw Callに関する変更
・基本的にglDrawArraysはglDrawElementsへ変更
・VAO/VBOの積極的な利用
Copyright Drecom Co., Ltd. All Rights Reserved. 113
・Rendererクラスの追加
・RendererにQueueされたRenderCommandをまとめてソート、実行する描画処理
Renderer
RenderCommand
RenderCommand
RenderCommand
Sprite::draw() OpenGL ES API
glDrawElements()Sprite::draw()Sprite::draw()
Copyright Drecom Co., Ltd. All Rights Reserved. 114
・Rendererクラスの追加
・RendererにQueueされたRenderCommandをまとめてソート、実行する描画処理
・RenderCommandによる振る舞いの変化
Copyright Drecom Co., Ltd. All Rights Reserved. 115
・Rendererクラスの追加
・RendererにQueueされたRenderCommandをまとめてソート、実行する描画処理
・RenderCommandによる振る舞いの変化TrianglesCommand CustomCommand BatchCommand
GroupCommand MeshCommand QuadCommand
Copyright Drecom Co., Ltd. All Rights Reserved. 116
・Rendererクラスの追加
・RendererにQueueされたRenderCommandをまとめてソート、実行する描画処理
・RenderCommandによる振る舞いの変化
・Global/Local Z Orderの概念
Copyright Drecom Co., Ltd. All Rights Reserved. 117
・Drawメソッドの変更
・RendererのQueueに対してRenderCommandを追加
Sprite::draw() glDrawArrays()version2
Copyright Drecom Co., Ltd. All Rights Reserved. 118
・Drawメソッドの変更
・RendererのQueueに対してRenderCommandを追加
Sprite::draw() glDrawArrays()
RendererSprite::draw() glDrawElements()
version2
version3
Copyright Drecom Co., Ltd. All Rights Reserved. 119
・Drawメソッドの変更
・RendererのQueueに対してRenderCommandを追加
・CustomCommandによるコールバック処理Renderer
Sprite::draw()Sprite::callback() glDrawElements()
Copyright Drecom Co., Ltd. All Rights Reserved. 123
・アップストリーム開発を行う上で
・メインストリームに対応していく
・原則としてCocos2d-xのソースコードには手を入れない
Copyright Drecom Co., Ltd. All Rights Reserved. 124
・アップストリーム開発を行う上で
・メインストリームに対応していく
・原則としてCocos2d-xのソースコードには手を入れない
・バグ修正やチューニングはpull request等で積極的に展開していく
Copyright Drecom Co., Ltd. All Rights Reserved. 125
・Cocos2d-xとの付き合い方
・そもそもCocos2d-x自体はパフォーマンス重視というよりも実装コストの軽減や汎用性を重視している
Copyright Drecom Co., Ltd. All Rights Reserved. 126
・Cocos2d-xとの付き合い方
・そもそもCocos2d-x自体はパフォーマンス重視というよりも実装コストの軽減や汎用性を重視している
・Cocos2d-xの機能を最大限に利用しながらパフォーマンスの改善を目指す
Copyright Drecom Co., Ltd. All Rights Reserved. 127
・パフォーマンス・チューニング上の前提
・Cocos2d-xで実装されている機能を利用する為、グラフィックスAPIはOpenGL ESを利用
Copyright Drecom Co., Ltd. All Rights Reserved. 128
・パフォーマンス・チューニング上の前提
・Cocos2d-xで実装されている機能を利用する為、グラフィックスAPIはOpenGL ESを利用
iOSAppleA7Metal
Android-
Vulkan
Copyright Drecom Co., Ltd. All Rights Reserved. 129
・パフォーマンス・チューニング上の前提
・Cocos2d-xで実装されている機能を利用する為、グラフィックスAPIはOpenGL ESを利用
・2Dのコマ割りアニメーションによる表現手法に対して問題と成り得る箇所を探る
Copyright Drecom Co., Ltd. All Rights Reserved. 132
・CPU側の問題
・Draw Callの問題glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glUseProgram(program);glUniformMatrix4fv(umvp, 1, GL_FALSE, current.mat);glUniform1i(utxt, BQBORDER_SAMPLER);glBindTexture(GL_TEXTURE_2D, texture[i]);glBindBuffer(GL_ARRAY_BUFFER, vbo[i]);glEnableVertexAttribArray(kCCVertexAttrib_Position);glEnableVertexAttribArray(kCCVertexAttrib_Color);glEnableVertexAttribArray(kCCVertexAttrib_TexCoords);glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, verticesglVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, colorsglVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, texCoordsglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eao);glDrawElements(GL_TRIANGLES, indexnum, GL_UNSIGNED_SHORT, 0);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);glBindBuffer(GL_ARRAY_BUFFER, 0);
glDrawElements
Copyright Drecom Co., Ltd. All Rights Reserved. 133
・CPU側の問題
・Draw Callの問題
Draw Callに関するOpenGL ESのAPIは呼び出し回数がボトルネックに繋がる為呼び出し回数を抑える
Copyright Drecom Co., Ltd. All Rights Reserved. 134
・CPU側の問題
・Draw Callの問題glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glUseProgram(program);glUniformMatrix4fv(umvp, 1, GL_FALSE, current.mat);glUniform1i(utxt, BQBORDER_SAMPLER);glBindTexture(GL_TEXTURE_2D, texture[i]);glBindBuffer(GL_ARRAY_BUFFER, vbo[i]);glEnableVertexAttribArray(kCCVertexAttrib_Position);glEnableVertexAttribArray(kCCVertexAttrib_Color);glEnableVertexAttribArray(kCCVertexAttrib_TexCoords);glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, verticesglVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, colorsglVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, texCoordsglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eao);glDrawElements(GL_TRIANGLES, indexnum, GL_UNSIGNED_SHORT, 0);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);glBindBuffer(GL_ARRAY_BUFFER, 0);
Copyright Drecom Co., Ltd. All Rights Reserved. 135
・CPU側の問題
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glUseProgram(program);glUniformMatrix4fv(umvp, 1, GL_FALSE, current.mat);glUniform1i(utxt, BQBORDER_SAMPLER);glBindTexture(GL_TEXTURE_2D, texture[i]);glBindBuffer(GL_ARRAY_BUFFER, vbo[i]);glEnableVertexAttribArray(kCCVertexAttrib_Position);glEnableVertexAttribArray(kCCVertexAttrib_Color);glEnableVertexAttribArray(kCCVertexAttrib_TexCoords);glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, verticesglVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, colorsglVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, texCoordsglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eao);glDrawElements(GL_TRIANGLES, indexnum, GL_UNSIGNED_SHORT, 0);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);glBindBuffer(GL_ARRAY_BUFFER, 0);
・Draw Callの問題(Cocos2d-x)
glDrawElements
Copyright Drecom Co., Ltd. All Rights Reserved. 136
・CPU側の問題
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glUseProgram(program);glUniformMatrix4fv(umvp, 1, GL_FALSE, current.mat);glUniform1i(utxt, BQBORDER_SAMPLER);glBindTexture(GL_TEXTURE_2D, texture[i]);glBindBuffer(GL_ARRAY_BUFFER, vbo[i]);glEnableVertexAttribArray(kCCVertexAttrib_Position);glEnableVertexAttribArray(kCCVertexAttrib_Color);glEnableVertexAttribArray(kCCVertexAttrib_TexCoords);glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, verticesglVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, colorsglVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, texCoordsglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eao);glDrawElements(GL_TRIANGLES, indexnum, GL_UNSIGNED_SHORT, 0);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);glBindBuffer(GL_ARRAY_BUFFER, 0);
・Draw Callの問題(Cocos2d-x)
glDrawElements
Texture / Shader
Copyright Drecom Co., Ltd. All Rights Reserved. 137
・CPU側の問題
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glUseProgram(program);glUniformMatrix4fv(umvp, 1, GL_FALSE, current.mat);glUniform1i(utxt, BQBORDER_SAMPLER);glBindTexture(GL_TEXTURE_2D, texture[i]);glBindBuffer(GL_ARRAY_BUFFER, vbo[i]);glEnableVertexAttribArray(kCCVertexAttrib_Position);glEnableVertexAttribArray(kCCVertexAttrib_Color);glEnableVertexAttribArray(kCCVertexAttrib_TexCoords);glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, verticesglVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, colorsglVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, texCoordsglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eao);glDrawElements(GL_TRIANGLES, indexnum, GL_UNSIGNED_SHORT, 0);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);glBindBuffer(GL_ARRAY_BUFFER, 0);
・Draw Callの問題(Cocos2d-x)
glDrawElements
Vertex
Copyright Drecom Co., Ltd. All Rights Reserved. 138
・CPU側の問題
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glUseProgram(program);glUniformMatrix4fv(umvp, 1, GL_FALSE, current.mat);glUniform1i(utxt, BQBORDER_SAMPLER);glBindTexture(GL_TEXTURE_2D, texture[i]);glBindBuffer(GL_ARRAY_BUFFER, vbo[i]);glEnableVertexAttribArray(kCCVertexAttrib_Position);glEnableVertexAttribArray(kCCVertexAttrib_Color);glEnableVertexAttribArray(kCCVertexAttrib_TexCoords);glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, verticesglVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, colorsglVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, sizeof(ccV3F_C4B_T2F), (GLvoid*)__builtin_offsetof(ccV3F_C4B_T2F, texCoordsglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, eao);glDrawElements(GL_TRIANGLES, indexnum, GL_UNSIGNED_SHORT, 0);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);glBindBuffer(GL_ARRAY_BUFFER, 0);
・Draw Callの問題(Cocos2d-x)
glDrawElements
Vertex
Texture / Shader
Copyright Drecom Co., Ltd. All Rights Reserved. 139
・CPU側の問題
・CustomCommandによるコールバック処理
・Global/Local Z Orderの概念
・Drawメソッドの変更
・Rendererクラスの追加
Copyright Drecom Co., Ltd. All Rights Reserved. 140
・CPU側の問題
・CustomCommandによるコールバック処理・Global/Local Z Orderの概念
RenderC
ommand
RenderC
ommand
RenderC
ommand
RenderC
ommand
RenderC
ommand
RenderC
ommand
RenderC
ommand
Custom
Command
RenderC
ommand
RenderC
ommand
Copyright Drecom Co., Ltd. All Rights Reserved. 141
・CPU側の問題
・CustomCommandによるコールバック処理
・Global/Local Z Orderの概念
・Drawメソッドの変更
・Rendererクラスの追加
Copyright Drecom Co., Ltd. All Rights Reserved. 142
・CPU側の問題
・Cocos2d-xのversion3ではAPI呼び出し回数の削減に対する最適化はきちんと行われている
・Cocos2d-xの最適化の手法を理解した上で、手法に沿った手段を用いて実装を
Copyright Drecom Co., Ltd. All Rights Reserved. 145
・ピクセル処理の問題「オーバードロー」
・1ピクセルに対して2回以上の描画処理
・GPU側の問題
Copyright Drecom Co., Ltd. All Rights Reserved. 146
・ピクセル処理の問題「オーバードロー」
・奥から手前への描画・アルファブレンド
・GPU側の問題
Copyright Drecom Co., Ltd. All Rights Reserved. 147
・ピクセル処理の問題「オーバードロー」
・奥から手前への描画・アルファブレンド=奥から手前への描画
・GPU側の問題
Copyright Drecom Co., Ltd. All Rights Reserved. 148
・ピクセル処理の問題「オーバードロー」
・奥から手前への描画・アルファブレンド→透過部分を最小限に
・GPU側の問題
Copyright Drecom Co., Ltd. All Rights Reserved. 150
・ピクセル処理の問題「フラグメントシェーディング」
・シェーダーのパフォーマンス
・GPU側の問題
Copyright Drecom Co., Ltd. All Rights Reserved. 151
・ピクセル処理の問題「フラグメントシェーディング」
・シェーダーのパフォーマンス複雑な処理を避ける分岐の数を減らすループを無くす演算精度を下げる※
・GPU側の問題
Copyright Drecom Co., Ltd. All Rights Reserved. 152
・透過部分の範囲を狭く、重なりを浅く・SpritePolygonの利用を検討
・独自のシェーダーについての最適化・サードパーティのシェーダーの確認
・GPU側の問題
・オーバードロー
・フラグメントシェーディング
Copyright Drecom Co., Ltd. All Rights Reserved. 153
・GPUによって部分的にパフォーマンスが異なる最適なチューニング箇所が異なる
・Cocos2d-xを利用する上でもGPUの理解を
・GPU側の問題
Copyright Drecom Co., Ltd. All Rights Reserved. 155
・CPU/GPU共通の問題
・メモリ帯域幅の問題
・iPhone5:AppleA6で8.5GB/sec程度・iPhone5s:AppleA7で15GB/sec程度
Copyright Drecom Co., Ltd. All Rights Reserved. 156
・CPU/GPU共通の問題
・メモリ帯域幅の問題
・メモリとその帯域幅はCPU/GPUで共有
CPU GPU
MEM / VRAM
Copyright Drecom Co., Ltd. All Rights Reserved. 157
・CPU/GPU共通の問題
・メモリ帯域幅の問題
・メモリとその帯域幅はCPU/GPUで共有
CPU GPU
MEM / VRAM
マルチスレッド テクスチャ
Copyright Drecom Co., Ltd. All Rights Reserved. 158
・CPU/GPU共通の問題
オブジェクトサイズ/数の削減テクスチャサイズ/数の削減圧縮テクスチャの利用マルチテクスチャ等の再考
・メモリ帯域幅の問題
Copyright Drecom Co., Ltd. All Rights Reserved. 159
・CPU/GPU共通の問題
・CPUやGPUそれぞれの最適化だけでは解消されない問題
・パフォーマンスに大きな影響を与えるが、表面化しづらい