質問: cocos2d-xのメモリ管理について 環境 cocos2d-x ver3.4 x-code C++ iOSアプリ メモリ使用量を減らす(元に戻す)方法が分かりません。 通常シーンを切り替えるとメモリ(Memory Use)は解放されると思うのですが、メモリが増え続けて減ることがありません。 以下の処理でシーンを切り替えています。 Director::getInstance()->replaceScene(TransitionFade::create(0.5f, HelloWorld::createScene(), Color3B::BLACK)); 画像を表示するとメモリ使用量が増えます。シーンが切り替われば画像は全て削除されるのではないのでしょうか?デバイスの画面上では消えていますが、メモリが減らないということは残っているということでしょうか?(キャッシュなのでしょうか?これもシーンを切り替えればキャッシュは消えるのではないのでしょうか?) 画像を消す時は以下の処理で消しています。(シーン切り替え時に全ての画像にこの処理を行っているわけではありません) a->removeFromParentAndCleanup(true); 原因がわからず大変困っています。何か分かる方教えてください。よろしくお願いいたします。
回答: 以下のサイトを参考にしてください。 ぽこつん研究所 201研究室 メモリ管理 cocos2d-x名前空間のObjectクラスやNode派生クラスはコンテナ格納時とコンテナ解放時に自動で参照カウントを増減してくれますが,生成時にインクリメントされた参照カウントだけはreleaseやAutoReleasePoolによって明示的に解放しなければいけません。これはデストラクタやサブルーチンをブレイクする時に実行するようにするといいと思います。 また,AutoReleasePoolを使用する場合,インスタンスの初期化時にautorelease()メソッドを呼んでおく必要が有ります(これはcocos2d-xのコンストラクタをオーバーライドしていなればcreate()実行時に自動で呼ばれます)。 ぽこつん研究所 201研究室 オブジェクトの継承 を参考にしてください。ただ情報が古いため,もしかするともっと良い機能に置き換えられている可能性があります。メモリが解放されていない根本的な原因は,オブジェクトのreleaseが上手くできていないことなので,それを解決するようにメソッドや処理などを書くことで解決します。 以下の記事も参考になります。 cocos2d-xのリファレンスカウンタを理解してクラッシュやメモリリークを防ぐ ちなみにremoveFromParentAndCleanup(true)はスプライトの参照カウントを-1して,スプライトなどに設定されているアクションなどを消すメソッドで,参照カウントが0になっていればそのオブジェクトは削除されますが,明示的にメモリを解放しているわけではありません。リンク先の公式ドキュメントが一番わかりやすく正しい情報が載っていると思うので,参考にしてください。 おそらくappDelegate.cpp中で前のシーンオブジェクトがメインルーチンから抜けるまで破棄されないので,メモリが解放できていないのだと思います。シーンオブジェクトが解放されてもシーンオブジェクトのメンバのメモリまで解放されているとは限らないので,シーンを抜ける時はデストラクタでやサブルーチンをブレイクする段階で全てのオブジェクトの参照カウントが0になることを(AutoReleasePool::clear()をループで実行するなどして)保証しておいたほうが安全だと思います。