[cocos2dx3.0] cocos2dx 3.0 betaがいろいろヤバイ

 先日公開されたcocos2dx 3.0 betaですが、リリースノートを見てもあまり変更点については触れられておらず、何が変わったのかよくわかりませんでした。が、使ってみると一目瞭然。alpha版から非常に大きな変更が加えられていました。

 私は個人で「俺々」という名前のcocos2dx ユーティリティライブラリを公開していますが、3.0 betaでは基本的に動作しなくなりました(cocos2dx-3.0betaというブランチで一応ビルドが通るところまでは修正してありますが、正しく動作しません)。今回は細かい変更点も踏まえて3.0 betaの特徴をまとめてみます。

 あ、ちなみに変更点を全部まとめたわけではないです。iOSで普通に開発してて躓いた部分をまとめた感じです。

相対パス問題の解決

 cocos2dxといえば、あの適当なproject_creatorでおなじみですが、3.0 betaからは(良くも悪くも)cocos2dフォルダが丸ごとコピーされるようになったので、任意のフォルダに移動してもビルドが通るようになりました。プロジェクトを作る度にものすごい量のファイルがコピーされるのでディスク圧迫しまくりです。

 問題になるのはgithubとかのVCSにpushしたとき、cocos2dがまるまるコピーされてしまうので非常によろしくない、ということです。私はとりあえずsubmoduleとして登録して回避しました。ググったら同じようなことをやっている人がいたので、参考にしてみてください。ただしcocos2dxのcloneにかなり時間がかかります。

-- create_project.pyでコピーされるcocos2dフォルダをどうにかする - きょこみのーと

Array, Dictionary, Stringの消失

 Arrayはcocos2d::Vectorに、Dictionaryはcocos2d::Mapに変更されました。Stringは消滅し、std::stringを使います(消滅と書きましたが実際には"非推奨化"です。が、一部ライブラリはArrayを引数に取るメソッドがなくなっており、対応が必要となります)。

 CCARRAY_FOREACHみたいな古き悪しき時代の置き土産を使うこともなく、イテレータやC++11のfor文でブン回せるようになりました。素晴らしいとは思いますが、std::vectorとstd::map(std::unordered_map)を採用しなかったのはなぜなんでしょうね…

レンダリングエンジンの変更

 本題はこれです。これがかなり厄介な変更でした。

 3.0 betaではレンダリング周りの処理が大きく変更されています。具体的には、drawが呼ばれるとレンダリングコマンドがキューイングされ、後で一括描画されるようになりました。つまり、従来のようにdrawの中でOpenGLを使って描画を行ってしまうと、正しく描画されません。drawの中で描画を行うと、それらの描画が終わった後にキューイングされたコマンドが実行されるため、Zオーダーを無視して再背面に描画されてしまいます。

 この問題は、DrawPrimitives名前空間に所属する関数群にも影響しており、プリミティブを描画するにはDrawNodeを使う必要が出てきました。また、Node等を継承して独自の描画クラスを作成する際も、draw周りの処理を工夫しなければなりません。

 また、その他にも描画周りで不具合が発生しており、元々不具合があったRenderTexture周りでの不具合が更に増えた模様です。また、この変更によりツール群の動作も不安定になっているようです。

まとめ

 その他にも非推奨になったクラスやメソッドがあり、betaでの変更点による影響はかなり大きいようです。またリリースノートも不十分、ドキュメントもないので現状利用を避けるのが賢明でしょう。趣味で使うならまだしも、仕事等で使うなら3.1くらいまで上がるのを待ってからのほうがよさそうです。しばらくは2系が安定なのかなー。でもC++11で開発したいし…困ったものです。

0 件のコメント :

コメントを投稿