相关疑难解决方法(0)

了解iPhone上的内存消耗

我正在使用OpenGL ES开发2D iPhone游戏,并且我一直在达到24 MB的内存限制 - 我的应用程序一直在崩溃,错误代码为101.我试着很难找到内存的位置,但是仪器中的数字仍然很多大于我的预期.

我使用Memory Monitor,Object Alloc,Leaks和OpenGL ES仪器运行应用程序.当应用程序加载时,自由物理内存从37 MB下降到23 MB,Object Alloc稳定在7 MB左右,Leaks显示两个或三个泄漏,几个字节大小,Gart对象大小约为5 MB,内存监视器说应用程序占用大约14 MB的实内存.令我感到困惑的是内存的去向 - 当我深入研究对象分配时,大部分内存都在纹理中,正如我所期望的那样.但是我自己的纹理分配计数器和Gart对象大小都同意纹理应该占用大约5 MB.

我不知道分配任何其他值得一提的东西,Object Alloc同意.记忆在哪里?(如果这还不够,我会很乐意提供更多细节.)


更新:我真的试图找到我可以分配这么多内存的地方,但没有结果.让我疯狂的是对象分配(~7 MB)与内存监视器(~14 MB)所示的实际内存使用之间的差异.即使我忘记了巨大的泄漏或巨大的内存块,它仍应出现在对象分配中,不应该出现吗?

我已经尝试过通常的 嫌疑人,即.在UIImage与它的缓存,但没有帮助.有没有办法逐行跟踪内存使用情况"调试器样式",观察每个语句对内存使用情况的影响?


到目前为止我发现了什么:

  1. 我真的使用那么多记忆.测量实际内存消耗并不容易,但经过大量计算后,我认为内存消耗真的很高.我的错.

  2. 我发现没有简单的方法来衡量使用的内存.内存监视器编号是准确的(这些是真正重要的数字),但内存监视器无法告诉您内存的确切位置.Object Alloc工具几乎无法跟踪实际内存使用情况.当我创建一个纹理时,分配的内存计数器会上升一段时间(将纹理读入内存),然后下降(将纹理数据传递给OpenGL,释放).这没关系,但并不总是发生 - 有时即使将纹理传递给OpenGL并从"我的"内存中释放出来,内存使用率也会保持很高.这意味着Object Alloc工具显示的内存总量小于实际总内存消耗量,但大于实际消耗减去textures(real – textures < object alloc < real).去搞清楚.

  3. 我误读了编程指南.内存限制为24 MB适用于纹理和曲面,而不是整个应用程序.实际的红线位置更远,但我找不到任何硬数字.共识是25-30 MB是上限.

  4. 当系统内存不足时,它会开始发送内存警告.我几乎没有任何东西可以免费,但其他应用程序确实会将一些内存释放回系统,特别是Safari(似乎是缓存网站).当内存监视器中显示的可用内存为零时,系统开始查杀.

我不得不咬紧牙关并重写代码的某些部分以提高内存的效率,但我可能还在推动它.如果我要设计另一个游戏,我肯定会考虑一些资源分页.在当前的游戏中它非常难,因为事物一直处于运动中并且加载纹理会妨碍,即使在另一个线程中完成.我会对其他人如何解决这个问题感兴趣.

请注意,这些只是我的观点,不一定非常准确.如果我发现有关此主题的更多内容,我会更新问题.我会保持问题公开,以防有人理解这个问题会关心回答,因为这些都是比其他任何事情更多的变通办法和猜测.

iphone memory-management opengl-es

35
推荐指数
1
解决办法
2万
查看次数

问题是在UIScrollView中使用相当大的图像来释放UIImageViews所使用的内存

我有一个大的UIScrollView,我正在放置3-4个相当大(320x1500像素左右)的UIImageView图像拼贴.我将这些UIImageViews添加到我的NIB文件内的滚动视图中.我的控制器上有一个插座,那就是UIScrollView.我正在使用一个属性(非原子,保留),并将其合并.

我的问题是:当我在Memory Monitor中观察到这一点时,我可以看到,当加载了所有这些图像的视图时(正如预期的那样),所使用的内存会相当大.但是当我离开视图时,它和它的控制器都是dealloc'd,但似乎并没有放弃它们占用的内存附近的任何地方.当我将其中一个视图(我的应用程序中有几个)切割成只有1-3个320x460的图像并将其他所有内容保持相同时,它会重新捕获内存.

使用这么大的图像有什么问题吗?我在这段代码中做错了什么(粘贴在下面)?

这是viewController的一个导致问题的片段.

- (CGFloat)findHeight 
{
    UIImageView *imageView = nil;
    NSArray *subviews = [self.scrollView subviews];

    CGFloat maxYLoc = 0;
    for (imageView in subviews)
    {
            if ([imageView isKindOfClass:[UIImageView class]])
            {
                    CGRect frame = imageView.frame;

                    if ((frame.origin.y + frame.size.height) > maxYLoc) {
                            maxYLoc  = frame.origin.y;
                            maxYLoc += frame.size.height;
                    }
            }
    }
    return maxYLoc;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.scrollView setContentSize:CGSizeMake(320, [self findHeight])];

    [self.scrollView setCanCancelContentTouches:NO];
    self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
    self.scrollView.clipsToBounds = YES;                
    self.scrollView.scrollEnabled = YES;

    self.scrollView.pagingEnabled = NO;
}

- (void)dealloc …
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch memory-management objective-c

11
推荐指数
1
解决办法
1万
查看次数

解决iPhone上内存泄漏的最佳方法是什么?

请建议解决iphone上内存泄漏问题的最佳方法.释放,自动释放,保留的最佳用途是什么,哪些适用于哪些情况?

iphone memory-leaks ios ios-simulator

4
推荐指数
1
解决办法
1927
查看次数