【发布时间】:2012-06-08 14:16:30
【问题描述】:
我正在使用 Cocos2D for iOS 开发游戏。
有一些像菜单之类的场景和一个主要的游戏场景。在主场景中只有三个动态对象。这些对象周期性地互相射击(直到这些对象被杀死或移出场景)。
现在的问题是:游戏不断消耗内存。我想找出我做错了什么。
没有像过度保留的对象这样的明显泄漏。场景获取dealloced,对象从父对象中移除并清理,动画停止等。
无论如何,记忆总是在某个地方。我正在使用以下代码
+ (void) reportMemory
{
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&info,
&size);
if (kerr == KERN_SUCCESS)
NSLog(@"Memory in use (in Kbytes): %f", info.resident_size / 1024.0);
else
NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}
找出每个场景开始时消耗了多少内存。并且报告的数字总是大于前一个。
我尝试使用分配分析器,但老实说,我无法找出任何有用的东西。我看到总生存字节基本相同,但进程不断分配和释放一些东西。
你建议我看什么?基本上,我正在寻求有关如何在我的情况下调试内存操作的建议。
编辑(对我有什么帮助):
原来我打开了 NSZombieEnabled。基本上,这是内存消耗不断增加的主要因素。可以在@coneybeare answer中找到一些有用的信息和提示
第二个最有用的事情是使用 @Jack 建议的工具(泄漏和分配)。它帮助我发现了几个微妙的漏洞。
【问题讨论】:
-
你的总生存字节数是多少?
-
@meccan 起初它大约是 42 Mb(此时预缓存了精灵图集的数量),然后每次运行场景时它会增长大约 2-5 Mb,一直到大约125 MB。在该进程被操作系统杀死之后。
-
哦,太疯狂了。你用过缓存的图片吗?
-
@meccan 是的,我预缓存了八个纹理图集(32bpp PNG)
-
只是一个猜测,但也许您的缓存不正确,并为每一帧分配新纹理。
标签: ios memory-leaks cocos2d-iphone profiling xcode4.2