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で高速にアニメが再生され不審に思い調べて問題が判明。
 
 
 
 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


3 − = 一


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>