cedec 2015 cocos2d-x と社内基盤の付き合い方...

173
Copyright Drecom Co., Ltd. All Rights Reserved. 1 Cocos2d-x と社内基盤の付き合い方 ~アップストリームファーストを目指して~ 株式会社ドリコム 高橋成人 木元将輝

Upload: drecom-co-ltd

Post on 12-Jan-2017

1.889 views

Category:

Technology


1 download

TRANSCRIPT

Copyright Drecom Co., Ltd. All Rights Reserved. 1

Cocos2d-x と社内基盤の付き合い方~アップストリームファーストを目指して~

株式会社ドリコム高橋成人木元将輝

Copyright Drecom Co., Ltd. All Rights Reserved. 2

理想な付き合い方

photo by Brett  Sayer

付き合い方

Copyright Drecom Co., Ltd. All Rights Reserved. 3

難しい

photo by greg  westfall

難しい!

Copyright Drecom Co., Ltd. All Rights Reserved. 4

痩せたこともありました

photo by Hometown  Beauty

痩せちゃうこともありました

Copyright Drecom Co., Ltd. All Rights Reserved. 5

自社メンテも考えました

自社メンテもしてみました

photo by Florian  F

色々あったけど共に歩むことにしました。

photo by Aurélien  Buttin

Copyright Drecom Co., Ltd. All Rights Reserved. 7

Cocos2d-x の話です、念のため

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. 12

社内基盤その名は

Bisque

Copyright Drecom Co., Ltd. All Rights Reserved. 13

l2013年開発開始

Copyright Drecom Co., Ltd. All Rights Reserved. 14

Bisque の目的

lネイティブシフト

lネイティブ環境の整備

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. 17

次のフレームワーク

Copyright Drecom Co., Ltd. All Rights Reserved. 18

Cocos2d-x 対応プラットフォーム

iOS

Copyright Drecom Co., Ltd. All Rights Reserved. 19

Cocos2d-x 特徴

H/W アクセラレータ ネイティブコード

高速 高速

Copyright Drecom Co., Ltd. All Rights Reserved. 20

なぜ選ばれたの?

Android

iOS

閲覧可能

改変可能

コスト削減

オープンソース

Copyright Drecom Co., Ltd. All Rights Reserved. 21

満たせたのは Cocos2d-x でした

v2.0.4 採用

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. 24

当時の切り札

WebView

Webゲームで培ったノウハウ

レンダリング、レイアウト

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 でコスト削減- ◯ 足りない機能は追加

photo by Erik  Schepers

2015年次のフェーズへ

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. 34

現状の bisque 構成

bisque

課金 sqlite3

サウンド 暗号処理

v2.0.4

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. 40

before

bisque

課金 sqlite3

サウンド 暗号処理

v2.0.4

Copyright Drecom Co., Ltd. All Rights Reserved. 41

after

課金 sqlite3

サウンド 暗号処理

bisque

core

v2.0.4

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. 44

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. 46

Cocos2d-x さようなら

課金 sqlite3

サウンド 暗号処理

bisque

core

Copyright Drecom Co., Ltd. All Rights Reserved. 47

利用しない機能さようなら

暗号処理

bisque

core

Copyright Drecom Co., Ltd. All Rights Reserved. 48

暗号処理こんにちは

暗号処理

bisque

core

Copyright Drecom Co., Ltd. All Rights Reserved. 49

Cocos2d-x と疎結合になったので…

課金 sqlite3

サウンド 暗号処理

bisque

v2.0.4

core

Copyright Drecom Co., Ltd. All Rights Reserved. 50

例: こういうのも悪くない

課金 sqlite3

サウンド 暗号処理

bisque

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 独立により必要最低限のバイナリ◯

あとは Cocos2d-x のバージョンアップだけ!

これは簡単そう!

photo by Paul  Hocksenar

Copyright Drecom Co., Ltd. All Rights Reserved. 57

Cocos2d-x バージョン要望

EngRD RD

バージョン固定したい

運用中アプリの安定化

最新を使いたい

最新機能の調査

すべてのバージョン

アプリ開発者へ機能提供

photo by Paul  Hocksenar

バージョンアップだけじゃ足りなかったよ…

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かと言って変更しないわけには…

photo by Jason  Corneveaux

自社の機能を追加しながら、メインストリームの最新を追いかけるうまい方法って

あるの?

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

アップストリーム開発

オープンソースソフトウェアに対して企業が行ったソースコード修正を元のオープンソースプロジェクトに還流させるプロセス

アップストリームファーストは還流を第一優先で考えること

photo by Alan  Doyle

アップストリームへ還流(イメージ図)

Copyright Drecom Co., Ltd. All Rights Reserved. 69

アップストリーム開発

自社特有の処理は自社でメンテナンスし汎用化可能なソースコードを還流する

リリースを追いながら自社の処理も追加できる開発手法

Copyright Drecom Co., Ltd. All Rights Reserved. 70

アップストリーム開発

修正を還流するためメインストリームの最新を追いかける必要があり、バージョン変更のコストを下げるのが必須になる

バージョン変更のコストを抑えられる

Copyright Drecom Co., Ltd. All Rights Reserved. 71

自社でメンテナンス

Copyright Drecom Co., Ltd. All Rights Reserved. 72

自社でメンテナンス

l追加した処理をメンテし続ける

lアップストリームが verup- 自社の変更点をすべて移行- 時間がたつほど移行対象が増える

lこれはうまく行った例

Copyright Drecom Co., Ltd. All Rights Reserved. 73

自社でメンテナンス(2)

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. 76

アップストリーム開発

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デメリット- 追い続けなければいけない- 反映されるまで遅い(保障もなし)

photo by Sudhamshu  Hebbar

アップストリーム開発採用基準

はどうやった?

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 メーカから携帯端末メーカ、パブリッシャーまでスポンサー、パートナーシップを組んでいる。

photo by Brett  Sayer

Cocos2d-x とは どう付き合っている?

Copyright Drecom Co., Ltd. All Rights Reserved. 87

github 自社gitlab

clonepull

Cocos2d-x と付き合うブランチ戦略

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. 96

アップストリーム開発

Copyright Drecom Co., Ltd. All Rights Reserved. 97

Cocos2d-x 2.xから3.xで大きく変化した事

Copyright Drecom Co., Ltd. All Rights Reserved. 98

・C++11準拠

・3D機能

・描画処理

・ローカルストレージ機能

・スクリプト関連

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. 110

・Rendererクラスの追加

・Drawメソッドの変更

・Draw Callに関する変更

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. 120

・Rendererクラスの追加

・Drawメソッドの変更

・Draw Callに関する変更

Copyright Drecom Co., Ltd. All Rights Reserved. 121

Cocos2d-xを利用する上でのパフォーマンス・チューニング

Copyright Drecom Co., Ltd. All Rights Reserved. 122

・アップストリーム開発を行う上で

・メインストリームに対応していく

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. 130

・CPU側の問題

・GPU側の問題

・CPU/GPU共通の問題

Copyright Drecom Co., Ltd. All Rights Reserved. 131

・CPU側の問題

・Draw Callの問題

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. 143

・ピクセル処理の問題

・GPU側の問題

Copyright Drecom Co., Ltd. All Rights Reserved. 144

・ピクセル処理の問題

・オーバードロー・フラグメントシェーディング

・GPU側の問題

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. 149

・ピクセル処理の問題「オーバードロー」

・SpritePolygonの利用

・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. 154

・CPU/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それぞれの最適化だけでは解消されない問題

・パフォーマンスに大きな影響を与えるが、表面化しづらい

Copyright Drecom Co., Ltd. All Rights Reserved. 160

・CPU側の問題

・GPU側の問題

・CPU/GPU共通の問題

Copyright Drecom Co., Ltd. All Rights Reserved. 161

まとめ

ドッグイヤーと言われる程に技術の進歩が早くなっており、

photo by R∂lf  Κλενγελ

ユーザの要求も増えてきています

photo by Matthias  Ripp

それに伴い、アップストリーム開発

が選択肢になる機会が増えてきました

現在、アップストリーム開発を採用している企業

が少ないので、

Upstream します

アップストリーム開発に挑戦することにしました

photo by Patrik  Theander

ぜひ、みなさまも参加してください

photo by Johan  Larkander

photo by Tintin44

一人で悩まず、問題を共有しましょう

開発者間でWin-win の関係を築けたら幸いです

Any Questions?

photo by Matthias  Ripp

Copyright Drecom Co., Ltd. All Rights Reserved. 171

ご静聴ありがとうございました

Copyright Drecom Co., Ltd. All Rights Reserved. 172

参考文献

Copyright Drecom Co., Ltd. All Rights Reserved. 173

参考文献

lオープンソースにおけるアップストリーム開発の意義