【问题标题】:Handling low-memory start-up situations on iPad devices处理 iPad 设备上的低内存启动情况
【发布时间】:2011-02-21 17:14:52
【问题描述】:

在 iPad 设备上运行的游戏应用程序存在很多内存不足的问题。所以我正在为我自己的游戏考虑以下解决方案:在应用程序启动之前,我分配所需的空间并在启动时立即释放它。

这似乎工作得很好,让我在应用程序运行时更稳定地解决内存分配问题。你怎么看待这件事?这是一个好方法吗?

例如:

{
    size_t size = 30*MB;

    NSLog(@"free up %u bytes", size);

    size_t allocated = 0;

    while(allocated < size && blocksCounter < MAX_BLOCKS) {
        const size_t blockSize = 256*KB;    // 256K blocks

        blocks[blocksCounter] = malloc(blockSize);

        if(blocks[blocksCounter]) {
            bzero(blocks[blocksCounter], blockSize);
        }
        else {
            NSLog(@"warning empty block at idx %d", blocksCounter);
        }

        blocksCounter++;
        allocated += blockSize;
    } 

    for(int i=blocksCounter-1; i>=0; i--) {
        if(blocks[i]) {
            free(blocks[i]);
        }
    }

    blocksCounter = 0;
}

【问题讨论】:

  • 欢迎来到 SO!花点时间查看FAQ,在“我应该在这里问什么问题”下。特别是第三点。由于您的问题似乎已经解决了,所以它变得有点主观。
  • 感谢斯蒂芬的指点!下次发帖时,我会牢记这一点!但是关于我的帖子,我实际上并不认为它是一个解决方案,希望人们告诉我该怎么做,因为上面的代码是一种解决方法。

标签: ipad ios memory crash ios-4.2


【解决方案1】:

这是非常糟糕的做法。因为强制发出内存不足警告会导致退出 iPod 应用程序或停止其他正在运行的后台应用程序(例如 Skype 或导航软件),这不是一个好的用户体验。

我会更仔细地观察你的内存消耗,并在每次启动应用时使用你的肘部来代替。这不是 iOS 上的好公民。

【讨论】:

  • 但是如果我只释放我的应用程序所需的空间,无论如何都应该在那里,我不认为它是肘部技术。我知道这是一种解决方法,但是我遇到了 AudioToolBox(在单独的线程中运行)没有让 iOS 足够快地释放内存的问题。首先它会因 malloc 返回 0 大小的块而崩溃,然后会出现 didReceiveMemoryWarning 消息。 :-/
  • 做好你该做的。但这看起来像一个黑客。也许考虑找到您在此处描述的内存问题的根源。也许在苹果的错误报告器上提交一个关于你的内存分配问题的错误。
  • 我考虑了你所说的,重新考虑了我的解决方案。我花了一整天的时间,但正如你所说,这真的是一个黑客。要走的路是在应用程序启动时预加载所有纹理。现在问题不再发生,我的应用程序的内存占用最小,是一个优秀的 iOS 公民。 ;-)
  • 听起来好多了。在本地缓存中预加载纹理并在出现内存不足警告时清空该缓存没有任何问题。比只分配内存更有意义。我很乐意提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
相关资源
最近更新 更多