2012-01-25 8 views
4

私のios cocos2dゲームのパフォーマンス改善に取り組んでいます。私はインストゥルメントツールの助けを借りて、アプリのメモリ割り当てをチェックしていました。 [NSBundle mainBundle]コールで宣言され保持されているCFStringオブジェクトが多すぎます。ので、このCFStringに問題です[NSBundle mainBundle][NSBundle mainBundle]によって宣言されているCFStringオブジェクト

私は次の行に

[[NSBundle mainBundle] pathForResource:@"resource-name" ofType:@"png" isDirectory:imageDirectory]; 

を書いた私のコードの多くの場所がありますされていますのCFString(不変) 責任発信者:

カテゴリー、それを言います私はpathForResourceメソッドでハードコードされた文字列を与えているので、上記のコードの?または、この問題の理由は何か?誰でも助けてくれますか?このCFString割り当ては約2Mbのコードを取っているので、心配しています。

よろしく

答えて

4

これらのCFStringは、アプリケーションバンドルに多数のリソースが含まれているために発生します。私のテストでは、バンドルのルートにある各ファイルに1つのCFStringが割り当てられていました。おそらく、これはパス名のキャッシュのようなものです。

私は現在、バンドル内の1,000のリソースを持つアプリケーションで作業しています。これらの変更不可能な文字列は〜300Kを占めています。大部分を削除すると、バンドル内の約80個のリソースに対して約100個のCFStringを使用して、約20Kのファイルが作成されます。

これを減らす答えは、リソースをバンドル内のサブディレクトリに置くことです。これを行うには、Xcodeの「フォルダ参照」を使用します。

たとえば、ゲーム用に1,000個のPNGがあるとします。これらをプロジェクトの "資産"というフォルダ(ディスク上)に置く。 "Assets"ディレクトリをXcodeにドラッグし、グループを作成する代わりにフォルダ参照を作成します。

+0

こんにちはジェスは答えに感謝します。 CFStringオブジェクトの数を減らす方法を説明してください。 – Aqueel

+0

バンドルのルートディレクトリの各パスに1つのCFStringがあるようです。ルートにあるファイルの数を減らすと、CFStringの数が減ります。 –

+0

ありがとうジェス。私は間違いなくそれを試み、皆さんに知らせるでしょう。もう一度ありがとう。あなたはどのようなパスが生成され、サブフォルダ内のリソースに対して生成されないのかを正確に教えてください。 – Aqueel

1

NSBundleは、文字列を割り当てており、いや、あなたはそこに何も悪いことをやっていない理由はありません、それはありません。 [NSBundle mainBundle]が2MBの文字列を実際に割り当てているとは思えないので、他の割り当てスタックトレースを見て、本当の原因を見つけることができるかどうかを確認することをお勧めします。

+0

カテゴリ:CFString(不変)と責任ある呼び出し元:[NSBundle mainBundle]がある場合、これはどういう意味ですか?これは私がインストゥルメントで気づいているものですから。 – Aqueel

+0

(デフォルトでは折りたたまれている)右側のサイドバーでスタックトレース全体を調べているのですか、あるいは単に機器の見た目だけをtableviewで見ていますか? –

関連する問題