cocos2d-xメモリの管理

Pocket

くまのがっこう神経衰弱バトル

画像や効果音を読みっぱなしにするとメモリを消費して古い機種などではアプリケーションが落ちてしまいます。そこでこまめにキャッシュを削除して消費メモリを抑える努力をしています。

くまのがっこう神経衰弱バトルはiPod 4 (iOS 6.1)メモリ256Mもサポートしているのでメモリはおよそ80Mを下回るようにしています。80Mを超えたあたりからmemory warningが出はじめます。iPhone 5以上ならそのようなことはありませんのでサポートする機種に合わせて目標値を決めれば良いとおもいます。

くまのがっこう神経衰弱バトルでは画像と効果音を大きく3つに分けて管理しています。

  1. 各シーン毎の画像/効果音
  2. ゲーム共通の画像/効果音
  3. アプリケーション共通の画像/効果音

cache

1.各シーン毎の画像/効果音は、シーンの開始時にキャッシュに読み込んで、そのシーンが終了するときにキャッシュを破棄します。主にシーン専用の背景画像やキャラクター、BGMなどです。

2.ゲーム共通の画像/効果音は、12ステージあるゲームの開始時にキャッシュに読み込んで全ステージを終了したときにキャッシュを破棄します。主にゲームのスコア表示やフレーム、ゲームエフェクトなど全ステージで共通の画像です。

3.のアプリケーション共通の画像/効果音は、アプリケーションを起動したときにキャッシュに読み込んで、アプリケーションが終了するまでキャッシュを破棄しません。主に全体で使用するボタン類、メッセージなどです。

シーン毎の画像/効果音のキャッシュへの読み込みと削除はコンストラクタとデストラクタで行っています。

HelloWorldScene.h

HelloWorldScene.cpp

この場合にシーンを切り替えた次のシーンでも同じHelloWorld.plistを使用していると現在のシーンのデストラクタにキャッシュが削除されてしまいエラーになりますので注意してください。

またシーンの切り替え中は現在のシーンと次のシーンのキャッシュ両方を同時に持つ事になるのでメモリの使用量は2重になりますので注意してください。

scene

キャッシュの設計を終えたら実際に動かしてXcodeのデバッグナビゲータを使ってメモリの使用量を測定して何処で何がメモリを喰っているか分析します。

memory

メモリを多く消費するところがある場合には画像の読み込みと破棄のタイミングを個別に調整してメモリの消費を抑えています。

古い機種を切り捨てればここまで神経を使わなくてもいいのかな…

Pocket

cocos2d-x共通の処理

Pocket

くまのがっこう神経衰弱バトル

全てのシーンで共通の処理をどのうように実装するかいろいろ考えて試しました。

はじめにAppDelegate.hとAppDelegate.cppに変数や関数を宣言して各シーンから呼び出してみたのですが、iPhoneでは問題なく動作しましたがAndroidでバックグラウンドに落としてからフォアグラウンドに戻ったときにAppDelegate.cpp内で宣言した変数の値が初期化されてしまうケースがありましたのでやめました。

つぎに、シーンの元になるクラスを作って全てのシーンがそれを継承する形でつくってみました。

AppFrame.h

AppFrame.cpp

シーンを作るときにはこれを継承して

HelloScene.h

HelloScene.cpp

とりあえずこれでうまく動いているのでこれでゲームを作っています。

Pocket

cocos2d-x画像の表示と解像度

Pocket

くまのがっこう神経衰弱バトル

様々なディスプレイのサイズに合わせてゲームをつくるのにはどうしたらよいのでしょうか。書籍などには様々な設定方法とその表示結果が紹介されていますが結局どれを選択したらよいのか?できるだけ手間をかけずに対応したかったので以下の条件でいろいろ試しました。

  • ゲーム画面のデザインが簡単
  • プログラムへの画像の組み込みが簡単
  • 解像度に関係なく用意する画像は1つにしたい
  • スマホだけ考えてタブレットの画質は考慮しない

その結果、ゲーム画面は以下のルールで作成することに決めました。

  • ゲーム画面は640 x 1136 pxで設計
  • 画像の座標は640 x 1136 pxの中央を原点とする
  • ゲームの操作は中央を原点とした640 x 960 pxの範囲内にする

このルールで作られた画像をResolutionPolicy::NO_BORDERでディスプレイにフィットさせて表示しています。

game_display

実際にこの条件で作った画面をiPhone 4, iPhone 5s, nexus 5で表示してみて操作と画質に問題がないと判断してこの仕様に決めました。iPhone 4をサポートしていることもありますがiPadで操作できないとappleの審査でリジェクトされるのでゲームの操作は640 x 960 pxの範囲内で可能にしています。

AppDelegate.h

AppDelegate.cpp

画像の位置は画面の中央を原点にしてデザインしています。

game_design

画面のデザインもプログラムへの画像の組み込みも中央が原点の方が直感的に解りやすいのでこの方法に決めました。

プログラムで画像の座標を指定するときは中央が原点の座標を画面の原点へ変換する関数を使用しています。左端と右端を原点とした座標の変換も実装しています。

HelloWorldScene.h

HelloWorldScene.cpp

 

sample1私たちはこのような方法でゲームをデザインしています。

Pocket