Cocos2d-x:v3.10でのAndroid開発環境メモ

Android studioに挑戦-あきらめ

cocos2d-xはv3.7からAndroid studioに対応したらしい。eclipseは非推奨となり今後サポートされなくなるのでAndroidStudioへの移行が必要。
AndroidStudioのインストールは成功したが、Runするとエラーになってしまう。今回は時間がないので使い慣れたeclipse(luna)を使うことにした。
今振り返るとNDKの設定をデフォルトから変更すべきだったのかもしれない。
Android studioでのNDKの設定はprojectを開いている状態で、メニューのFile->project structureを選択し、表示されるウインドウの左カラムからsdk locationを選択する(下図)。
現状は画像のようにバンドルされていたデフォルトのNDKを利用しているが、Cocos2d-xの場合は少し古いNDKでないとビルドできないことが多いので
ASsdk
 

bash_profileの設定

bash_profileはmiで編集するのが便利。miは「不可視ファイルを開く」があるので。
cocos2d-x:v3.10をビルドできた設定は以下の通り(パス部分のみ抜粋)。
ポイントはNDKのバージョン。以下のように「r10e」をダウンロードしてきて利用した(現時点での最新はr11cでv3.6で利用していたのはr9d)。
SDKはAndroidstudioで管理しているsdkへのパスにした。
——————————————————————
export NDK_ROOT=/Users/designdrill/androidDev/android-ndk-r10e
export ANDROID_SDK_ROOT=/Users/designdrill/Library/Android/sdk
export ANT_ROOT=/Users/designdrill/androidDev/apache-ant-1.9.7/bin
——————————————————————
少し躓いたのはantの設定。これは上記のようにbinまでパスに含める必要がある
→参考:[Mac]Cocos2d-x開発環境構築

eclipseの設定

eclipseの最新版(最終版?)はmarsだがメニュー構成が結構異なるので、使い慣れたlunaを利用することにした。
sdkへのパスは現状eclipseにバンドルされたsdkを利用(下図)しているが、これはAndroidStudioの方に合わせた方がよいかもしれない(bash_profileもAndroidStudioのにしているし)?。sdkは同じURLから更新されるので問題ないと思うが、結構ファイルサイズが大きいし、各々でバージョンアップしなければならないので。
eclipse
eclipseのsdkの設定はpreferencesのAndroidから行う(上図)。
 
ちなみにAndroid SDKへのURLは現在Android studioへのリンクになっているが、Android sdkは単体でもダウンロードが可能(android-sdk-macosx:現時点最新はr24.4.1)。Android Stdioのサイトにある「Download Options」をクリックすると単体のandroid-sdkが置いてある場所に移動します(下図)。
macsdk

Nend広告の組み込み

まずはNend広告を組み込まずに実機プレイまで可能なことを確認。この段階でAndroid固有のバグがないかを確認する。
バグがないことを確認したらNend広告の組み込み。build_native.pyで生成されたフォルダなどは削除せずに上書きビルドする。
このときAndroidManifest.xmlにgoogle-play-serviceの設定があるとビルドを通らないので、これはコメントアウトしてeclipseで読み込んだ後に有効にする(たぶん私の環境設定の不備のためだと思う)。
あと今回躓いたのは以下の点!

Nendのバナー広告だけ出ない!

現時点で最新のnend_java(net/nend/NendModule:日付2015/10/16)だとbuild_native.pyが通らない。なので1つ古いnend_java(日付:2015/10/1)を利用してbuild_native.pyを通した
しかし、これだとバナー広告が表示されない(インターステイシャルは表示される)。なのでbuild_native.pyを通してから、eclipseに読み込む前にNendModule.javaだけを新しいファイル(日付:2015/10/16)のに差し替えた。するとバナーも表示された。
nend
そもそも最新のNendModule.javaがビルドを通らないのがいけない。またNDKのバージョンなどが関係しているのだろうか?
とりあえず上記の対応で安定して機能しているので良しとしよう。
 
 
 

Cocos2d-x:v3.6だとOK、v3.10だとクラッシュ

結論:100fpsとか無理だから!

 

弾幕ゲームの制作を始めた頃(Cocos2d-x v3.2)の問題

弾の移動処理はupdate関数内に記述していた。しかし弾の移動速度が微妙に揺らぐ(カクつく感じではなくsinカーブのような緩急がつく感じ)。人によっては気づかないレベルだが、見ていると気持ち悪くなる(乗り物酔いの感じ)。

schedule関数に切り替える

弾の移動処理をschedule関数内に記述し、実行間隔を1/60秒(60fps)に設定。しかしupdateと同じ症状。

100fpsに!!

scheduleの実行間隔を0.01秒(100fps)に変更すると揺らぎが無くなった!!
弾幕の光、弾幕の器、弾幕の器2の弾の移動処理はすべて100fpsで処理されている。
Android5への対応でCocos2d-xのバージョンを3.6に変更したが、100fpsの設定は変更無し。

100fpsでクラッシュ

弾幕の檻Android版からCocos2d-xのバージョンを3.10にアップ。実機でアプリがクラッシュ。iOSでもクラッシュするのでAndroid固有の問題ではない。
100fpsの処理を60fpsにしたらクラッシュしなくなった。そして3.2から苦しめられていた微妙な揺らぎも発生しない!
 
 

そもそも60fps以上を設定することが間違い

スマホの描画は60fpsが最大(ゲーミングPCのように120fpsとか無理!)だと思うので、100fpsで弾を移動させること自体が間違い。100fpsでの処理についてはずっと気になっていた。前回の記事(計算負荷を減らす)のなかでも問題にしており、揺らぎがギリギリ気にならない83fpsまで頻度を落としている。
今回iOS版(Cocos3.2:fps83)とAndroid版(Cocos3.10:fps60)の比較動画を作成したが、83fpsと60fpsに大きな差はない。やはり60fps以上の設定は無意味。でも以前のCocosでは気持ち悪い揺らぎが発生して、仕方なく無茶なfpsを設定

 
 

詳細

すぐにクラッシュするのではなく1秒くらい経過してからクラッシュ
クラッシュの直接の原因はschedule内でthisがspriteとして参照できなくなるため(下図)。
スクリーンショット 2016-05-11 0.00.47
 
正常な場合は以下のようにthisはspriteとして参照できている。
スクリーンショット 2016-05-10 23.59.38
 

その他

・fpsが高くても1秒は耐える。という挙動が気になったので、アプリでは58fpsと微妙に処理頻度を落とした。
・schedule間隔が0.0になっている場所があった(fps無限大!)しかし、ここではクラッシュしなかった(何故?)。
 ※計算式でschedule間隔を設定しており、その計算式が間違っていた。
 ※炎弾のアニメ処理で3.10で高速にアニメが再生され不審に思い調べて問題が判明。