2012-01-25 29 views
4

我正在努力提高我的ios cocos2d游戏的性能。当我注意到一件事情时,我正在使用Instruments工具检查应用程序的内存分配情况。有太多的CFString对象被[NSBundle mainBundle]调用声明和保存。它说,由[NSBundle mainBundle]声明的CFString对象

类别:CFString字符串(不变) 负责来电:一个NSBundle mainBundle]

有我的代码中的许多地方,我写了下面几行

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

难道这CFString字符串问题是因为上面的代码,因为我在pathForResource方法中给硬编码的字符串?或者什么可能是这个问题的原因?任何人都可以帮忙吗?这个CFString分配需要大约2Mb的代码,所以我很担心它。

问候

回答

4

这些CFString是由于您的应用程序包中有大量资源。在我的测试中,我发现为捆绑的根目录中的每个文件分配了1个CFString。据推测这是某种路径名称的缓存。

我目前正在研究捆绑中有1,000个资源的应用程序,这些不可变的字符串占用了大约300K。当我删除它们中的大部分时,我用约20K结束了,大约100个CFStrings用于捆绑约80个资源。

看起来减少这些问题的答案似乎是将资源放入包中的子目录中。您可以在Xcode中使用“文件夹引用”来执行此操作。

例如,您的游戏可能有1,000个PNG。把它们放在项目中的一个名为“Assets”的文件夹中(在磁盘上)。将“Assets”目录拖到Xcode,而不是创建一个组,创建一个文件夹引用。

+0

嗨Jess谢谢你的回答。请解释这将如何减少CFString对象的数量? – Aqueel

+0

该包的根目录中的每个路径似乎都有1个CFString。减少根目录中文件的数量会减少CFStrings的数量。 –

+0

谢谢Jess。我肯定会尝试,并会让你们知道。再次感谢。您能否确切地说明生成的路径以及为什么不生成子文件夹中的资源? – Aqueel

1

不,这不是为什么一个NSBundle被分配字符串,不,你没有做什么不对劲的地方。看起来非常不可能的是 - [NSBundle mainBundle]实际上是分配2MB的字符串,所以我建议你看一下其他的分配堆栈跟踪,看看你是否能找到真正的罪魁祸首。

+0

所以如果有分类:CFString(不可变)和Responsible Caller:[NSBundle mainBundle]那么这到底意味着什么呢?因为这是我在文书中注意到的。 – Aqueel

+0

您是否正在查看(默认折叠)右侧栏中的完整堆栈轨迹,或者只是Instrument在tableview中的最佳猜测? –