皆さんはメモリの量を気にして開発をしていますか? 私は、全然気にしていません。とりあえず何かエラーが出ない限りは何もしません。
cocos2dxはメモリ管理がとても簡単なので、何か特殊なことをしない限りメモリがリークすることはありません。 また、デバイスの性能も年々上がっているので、滅多なことではアプリが落ちたりすることはないです。
ただ、メモリ使用量は少ないに越したことありません。 今回は、このメモリの消費を減らす方法を紹介します。
メモリの見方
メモリはXcode上から確認ができます。 下記画像の赤枠を押せば見れます。
Memoryを押すと詳細画面を見れます。
メモリのグラフが何もしていないのみ右肩上がりに増えている場合、どこかでメモリリークしています。
メモリ使用量を抑える
メモリが増える原因は色々あると思うのですが、画像のキャッシュに気をつけて下さい。 特に大きな画像になるほど、使用メモリ量は大きくなります。 [c] //例えば、このようにキャッシュを使っていませんか? SpriteFrameCache::getInstance()->addSpriteFramesWithFile("sprite_atlus.plist");
auto batch = SpriteBatchNode::create("background.png"); this->addChild(batch); [/c]
キャッシュを利用すれば、CPUに負担をかけず素早く画像を表示できます。 ただ、使いすぎるとメモリの量が多くなってしまいます。
解決策1 : 「Sceneを移動」させる
一番簡単な方法は、こまめに「Sceneを移動」させることです。 [c]
//Sceneを移動させる Director::getInstance()->replaceScene(HelloWorld::createScene);
[/c]
Sceneを移動した時に、今まで利用されていたキャッシュも解放されます。 そのためにメモリの使用量も減ります。
解決策2 : キャッシュを開放させる
「Sceneを移動」がゲームの関係上出来ない場合は、必要に応じてキャッシュを開放させて上げましょう。 [c]
Director::getInstance()->purgeCachedData();
[/c]
上記のコードを利用すれば、現在利用されているキャッシュが解放されます。
注意点
このコードを利用すると文字通り全てのキャッシュが無くなります。 ですので、再度画像を利用する場合などはもう一度キャッシュを読み込まないとエラーになってしまいます。
また、画面上で画像が使用されている場合、このコードを呼び出してもキャッシュが解放されません。 ですので、画像を削除してから利用をする必要があります。
この辺り、もっと良い方法があればいいのですが色々調べてみても適切な回答がありませんでした。 何か良い方法があれば教えて欲しいです。
解決策3 : 画像のサイズを小さくする
利用している画像のサイズを小さくすればキャッシュをした場合、メモリ量も少なくなります。 今使っている画像が適切なサイズかどうかを調べてみてください。
個人的案件
例えば、何か大きな画像(地図)の上にオブジェクト(Sprite)を表示する場合。 私は、画面に配置しやすいように、地図のサイズに合わせてオブジェクトを保存していました。
ただこれでは、メモリの使用量が個別にオブジェクトを保存するより大きくなっています。 メモリのことを考えると、配置はメンドクサイですが画像サイズを「個別に保存」した方がいいです。
解決策4 : 必要なキャッシュを読み込む
「キャッシュを読み込むのには時間がかかるので、最初に一気に読み込んでしまおう!」と考えたことはないでしょうか? 確かに、画像の量が少ない場合はこれでいいかもしれません。 もし、メモリで問題が生じた場合は、必要な場合にだけキャッシュを読み込んだ方がいいでしょう。
最後に
私は、上記の方法を使って約半分メモリの使用量を抑えることに成功をしました。 本当はそこまでしなくても良いのかもしれませんが、個人的にCPUやメモリに関しては使用量がとても気なるタイプなので色々と工夫をしてみました。 是非何かの参考にしていただけると嬉しいです。
cocos2d-xではじめるスマートフォンゲーム開発 [cocos2d-x Ver.3対応] for iOS/Android 三木 康暉 技術評論社 2014-12-27 売り上げランキング : 17309 Amazonで詳しく見る |