- ぽんこつです(@ponkotuy)
- 芸者東京エンターテイメントでゲーム作ってます
- C++じゃなくてScalaの人です
- ゆとりプログラマにC++とメモリ管理は無理過ぎた
- Cocos2dx(Ver2)が辛い話をします
- C++03以前の話
- No Constexpr, No Template
- まともなC++の話を期待している方は休憩時間です
- Wanted
- リッチなスマートフォンアプリ(ネイティブ)
- Required
- マルチプラットフォーム(特にiOS + Android)
- Must
- デザイナーとの連携
- マルチプラットフォームなネイティブアプリが作成可能
- CocosBuilderを使って画面・アニメーション作成
- C++でObj-Cよりリッチなプログラミング環境
本当にObj-Cよりリッチか?
- Cocos2dxはObjective-C版Cocos2dのC++移植
- 結論としては開発者がC++分かってない
- 実体は劣化Objective-C
- Cocos2dx問題の象徴CCArray class
- Objective-CではNSArrayより高速として使用を推奨
- 幾らかの標準のメソッドがCCArrayを返してくる
- Create
- static CCArray* create();
- Insert
- void addObject(CCObject* object);
CCObjectとかいう何かおぞましいものが
- 要素はCCObjectの継承がマスト
- CCObjectはJavaの全ての基底クラスObjectみたいな
- Cocos2dxのクラスは殆ど全てCCObjectを継承している
ループの回し方
CCARRAY_FOREACH(ccArray, obj) {
CCNode* node = static_cast<CCNode*>(obj);
...
}
- CCARRAY\_FOREACHという謎マクロ
- 一旦CCObjectに変換されるのでブチ壊される型情報
- ちなみにiteratorは実装されてない
std::vectorと以下の操作で比較する
- float型で0からnまでコンテナに突っ込む
- ↑を足して合計値を出す
float stdVectorSum(float count) {
std::vector<float> vec;
for(float f = 0.0f; f < count; ++f)
vec.push_back(f);
return std::accumulate(
vec.begin(), vec.end(), 0.0f);
}
float ccArraySum(float count) {
CCArray* array = CCArray::create();
for(float f = 0.0f; f < count; ++f)
array->addObject(new CCFloat(f));
float sum = 0.0f;
CCObject* elem = NULL;
CCARRAY_FOREACH(array, elem) {
CCFloat* f = static_cast<CCFloat*>(elem);
sum += f->getValue();
}
return sum;
}
- CCFloatというCCObjectを継承したclassが必要
- STLのアルゴリズムが使えない
- CPU
- Core i5-4570S 2.90GHz
- OS
- Ubuntu 14.04
- CXX
- g++4.8.2
- CXXFLAGS
- -O3
で10000000万要素、先程のコードを回した結果が
- CCArray
- 0.569s
- std::vector<float>
- 0.057s
- std::vector<CCFloat>
- 0.397s
- CCArray
- 0.569s
- std::vector<float>
- 0.057s
- std::vector<CCFloat>
- 0.397s
CCArrayの遅いのはCCFloatのboxing、unboxingが原因
ただしstd::vector<CCFloat>でもCCArrayの方が遅い
array->addObject(new CCFloat(f));
これはリークしてません。
- CCObjectは参照カウント方式の自動解放を持つ
- addObjectでretainを発行(参照カウントが+1
- removeObjectでreleaseを発行(参照カウントが-1
される為です
- 初期のスマホゲーム開発で強力だったCocos2dx
- Cocos2dx(Ver2)の全体的にCCArrayレベルの残念設計
- boxing、unboxingこわい、遅い
- まずはちゃんとSTL使おう
- Unity(C#)かCocos2dx(Ver3)使いたい
- 速度計測に使ったコード