1.
FINAL
FANTASY
Record
Keeper
cocos2d-‐xレイヤーの最適化
株式会社ディー・エヌ・エー
Japanリージョン
ゲーム事業本部
技術・編成部
開発基盤グループ
惠良良
和隆
kazutaka.era@dena.com
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
10.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
つまり・・・
全く最適化されていない・・・orz
11.
最適化⽅方針
! CBT終了了から正式リリースまで時間的余裕は無い
! 出来る限りリスクが低いコード修正に絞りたい
⁃ 複数プランを出し、⼿手軽で効果の⾼高そうなものから着⼿手
! ⼤大規模なデータ改修は避けたい
! ベンチマークとなる端末(iOS、Android)を決める
⁃ iOS:iPhone4S
⁃ Android:Galaxy
S2(Android2.3系のもの)
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
! 最適化作業はiOS端末で⾏行行う
⁃ Androidに⽐比べてプロファイラが充実している
⁃ ネイティブコードのデバッグのし易易さ
12.
最適化⼿手順
1. コンパイラによる最適化が有効なビルドを準備
2. プロファイラで情報収集(Xcode、Instruments)
3. ボトルネックの候補を抽出
4. 負荷原因を調査
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
a) コードを⾒見見て推測
b) 推測を元にコード修正
c) パフォーマンスの変化をチェック
5. 正式なコード修正
6. 1.に戻る
13.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Xcodeのプロファイル機能
14.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Xcodeのプロファイル機能
15.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Xcodeのプロファイル機能
16.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Xcodeのプロファイル機能
17.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Xcodeのプロファイル機能
18.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Instruments
の
Time
Profiler
19.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Instruments
の
Time
Profiler
20.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
具体的なボトルネックの例例
! 頂点数0のドローコール
! ⾒見見えないスプライト描画
! ありえないほど多い描画パス
! 無駄なOpenGL
ES
API呼び出し(DrawCall以外)
! 透明部分の多いスプライト描画
! ⼤大量量のCCNodeで構成されたシーングラフ
! cocos2d-‐‑‒xのダメ実装
! 画⾯面外への描画
! ⼤大量量のドローコール数
21.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
頂点数0のドローコール
22.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
頂点数0のドローコール
23.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
頂点数0のドローコール
24.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
⾒見見えないスプライト描画
25.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
⾒見見えないスプライト描画
頂点情報を確認してみると、
RGBAが全て0になっていると分かる
26.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
⾒見見えないスプライト描画
27.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
ありえないほど多い描画パス
28.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
ありえないほど多い描画パス
29.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
ありえないほど多い描画パス
毎フレーム、20回もglClear()をコール!
30.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
ありえないほど多い描画パス
31.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
ありえないほど多い描画パス
諸悪の根源:マスクノード
32.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
ありえないほど多い描画パス
! マスクノードとは?
⁃ ⾃自⾝身の⼦子孫ノードをテクスチャに描画し、
そのテクスチャに対してαマスクを適⽤用する独⾃自拡張ノード
! 便便利利なので・・・と多⽤用された結果、描画パスが20に!
マスクノード禁⽌止令令発令令!!
本当に必要なところでしかマスクノードは使わない。
バトル画⾯面で使われているものは、
マスクノードでなくても良良いものだった。
これらを削ることで、描画パスは1になった。
33.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
無駄なOpenGL
ES
API呼び出し(DrawCall以外)
34.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
無駄なOpenGL
ES
API呼び出し(DrawCall以外)
問題となっている箇所は全て独⾃自拡張したコードで、
cocos2d-‐xのOpenGLステートキャッシュを使っていない
⇓
ステートキャッシュを使うように修正
35.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
透明部分の多いスプライト描画
36.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
透明部分の多いスプライト描画
37.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
透明部分の多いスプライト描画
38.
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
透明部分の多いスプライト描画
予め合成した画像を⽤用意
39.
⼤大量量のCCNodeで構成されたシーングラフ
CCNode::visit()が負荷の上位にいる
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
⇓
CCNodeが2000程存在していることが理理由
40.
CCNode::visit()の処理理内容
! Visibleフラグをチェックし、フラグが⽴立立っていなければ
何もしない(⼦子ノードのvisit()も呼ばない)
! OpenGL⽤用⾏行行列列スタック操作
! アフィン変換⾏行行列列からOpenGL⽤用⾏行行列列の更更新
! ⼦子ノードのvisit()呼び出し
! ⾃自⾝身のdraw()呼び出し
1つ1つは⼩小さな処理理でも、
実⾏行行回数が多いので無視出来ないほどの負荷になる
Copyright
(C)
DeNA
Co.,Ltd.
All
Rights
Reserved.
Be the first to comment