予想外に負荷が高かった
開発環境が新しくなりました(iMac5k + 最新のiPodTouch)。スペックが上がったので弾幕もたくさん出せる!と思ったのですが予想以上に厳しかった…。いろいろ調整しましたが以下の動画レベルの弾幕が60fpsを保てる限界っぽいです。動画ではfpsが結構ブレていますが、これはUsbを経由してiPodの画像をMacに送る作業を並行しているためです。
高負荷の正体はアニメ
動画は調整後なので60fpsを維持できているのですが、調整前ではアニメ弾幕はハロー効果の有無にかかわらずfps落ちしていました。これまで高負荷の要因はハロー効果だと思っていたのですがアニメ無しの弾幕にハロー効果をつけてもfps落ちしなかったのでアニメが高負荷ということに気がつきました。
アニメの描画を50fpsから12.5fpsへ
アニメの処理を確認すると50fpsで書き換え処理をしていました。これを1/4の12.5fpsに落としたのが動画のサンプルで、fps落ちを何とか免れました。Cocos2d-xのソース的には以下のようにスケジュールのタイミングを1/4にしただけです。これまでの動画と比べアニメが若干カクカクしています。
this->schedule(schedule_selector(EnemyBullet::frameAnime), 0.02);
↓
this->schedule(schedule_selector(EnemyBullet::frameAnime), 0.08);
ハロー効果が高負荷と考えた理由
描画負荷は操作する面積に比例します。ハロー効果の画像は薄くて目立たないのですが100px四方(つまり1万pixel)あり非常に大きいのです。歯車のような弾は大きめですが50px四方(2500pixel)でハロー効果画像の1/4しかありません。
さらに弾幕にはPhotoshopのレイヤーでいうところの「スクリーン」の設定がしてあります。これにより弾が重なったときに光が強くなるような効果を得ることができるのですが、これは画像が重なれば重なるほど負荷が高くなります。Cocos2d-xのソース的には以下の設定。
lightBulletNode->setBlendFunc(BlendFunc::ADDITIVE);
通常のレイヤー設定であれば隠れている部分は処理せず、一番上の画像だけを表示するだけなので負荷は低めです(ただし半透明の部分が多くなると負荷は高くなる)。
次回の弾幕は低スペックの機種は対象外
次回の弾幕ゲームはiPhone6以降のスペックが必要なものにしようとおもいます。新しく購入した実機検証機のiPodTouchはiPhone6と同じCPUですがクロック周波数がiPhoneよりも低めです。
twitterを本格的に初めてみた。ブログの更新記事をつぶやくのがメイン。あとCocos2dやUnity、その他アプリ開発に関連するツイッターの方をフォローして情報も集められたらなぁと思います。
— 柳澤@ゲーム作るよ (@designdrill) 2015, 12月 28