質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3616閲覧

cocos2d-xのメモリ管理について

nozurozu

総合スコア12

iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/03/03 12:56

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);

原因がわからず大変困っています。何か分かる方教えてください。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のサイトを参考にしてください。

ぽこつん研究所 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()をループで実行するなどして)保証しておいたほうが安全だと思います。

投稿2016/03/12 18:07

編集2016/03/12 19:02
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nozurozu

2016/03/19 13:25

詳しくありがとうございました!助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問