【问题标题】:What is released when restarting an iOS device?重启 iOS 设备时会释放什么?
【发布时间】:2018-02-10 18:02:47
【问题描述】:

小问题

我有一个错误,只有在我重新启动设备时才会消失。我想知道重新启动 iOS 设备时发布了什么,以便了解我的错误是什么。 释放我的缓存和我的 RAM 无助于修复我的错误,所以我想知道 还有什么可以发布来在短时间内修复我的错误。

上下文

我有一个使用 WebGL 和 BabylonJS 的网络应用程序。它在除 iOS 之外的所有设备和所有浏览器上都运行良好。使用 Safari,我总是以错误消息“此网页出现问题,因此已重新加载”结束。

它发生在运行 iOS 10.3.3 的 iPad Air 2 (2Go RAM) 上,但我在我手中的每台 iOS 设备上都看到了相同的错误。这就是为什么我认为它仅与 iOS 相关。 我知道 iOS 资源限制:https://stackoverflow.com/a/22193143/5053300

我尝试调试了几个月,这个错误随机出现,有时很快,有时很慢。没有什么一致的,所以完全不可能调试。

最好的猜测是内存问题,因为每次崩溃似乎都更快。而且因为错误消息总是与内存问题有关。

我怀疑纹理和 renderTargetTextures 占用越来越多的内存(但我不明白为什么它不会被释放,我不会保留无用的引用)。

但有一点我很确定:当我重新启动设备时,它总是第一次工作(直到我重新加载一次,然后开始下降)。

如果我清理我的缓存(通过设置 -> Safari)和我的 RAM(当我们处于关机屏幕时按主页按钮),错误仍然存​​在。但是如果我重新启动我的设备,它就会消失。 内存中的某些东西被释放了,我想知道是什么。

但我也可能完全错了,它可能不是记忆,我愿意接受你的所有建议。

提前感谢,这让我发疯了好几个月!

更新

这就是 JS 堆的样子:

更新 2

scene asking for 90 renderTargetTextures (379x890) 每个帧都可以在 iOS 上运行。 如果我不要求任何 renderTargetTextures,我的应用程序就可以工作。但是,如果我每帧只要求一个小的 renderTargetTexture,它或多或少会很快崩溃。 我可以从这个观察中得到什么结论?它是否证实或否认了内存问题的想法?

更新 3

不知道下面的代码确实是问题的原因,但是评论/取消评论它通常会使错误消失/出现。

var texture = generateTexture();
function generateTexture() {
    var rt1 = new BABYLON.RenderTargetTexture("rt1", { width: scene.getEngine().getRenderWidth(), height: scene.getEngine().getRenderHeight() }, scene, false, true, scene.getEngine().TEXTURETYPE_UNSIGNED_BYTE, false);
    rt1.wrapU = BABYLON.Texture.CLAMP_ADDRESSMODE;
    rt1.wrapV = BABYLON.Texture.CLAMP_ADDRESSMODE;
    rt1.renderList.push(sphere);
    rt1.onBeforeRender = function() {
        sphere.material = std1;
    };
    scene.customRenderTargets.push(rt1);
    return rt1;
}

我可能坚持认为这段代码在link posted in update 2 中有效,所以我认为这段代码不相关。唯一的事情是,评论应用程序的这一部分似乎消除了随机错误。 此代码要求 3D 引擎在渲染到屏幕之前渲染到一个中间纹理。所以这段代码会影响每一帧。 在链接中,我要求引擎在渲染到屏幕之前先渲染成纹理 90 次。

更新 4:问题已解决

问题不取决于 iOS 重启时发布的内容,所以我无法回答自己的问题。但我可以说 iOS 不喜欢动态光照。 从现在开始,我们所有的项目都将限制在 iOS 设备上。

更多的灯光,每帧更多的计算。在短时间内杀死要求过多内存的应用程序对于 iOS 来说太过分了。

【问题讨论】:

  • 请显示一些代码以便于调查问题。
  • 无法隔离bug,随机出现。而且代码太大了。这就是为什么我不要求任何人修复我的错误,因为我无法显示任何相关代码。对不起。由于它是一个 WebGL 应用程序,因此在每一帧都会生成和释放纹理。这可以解释为什么内存问题随机出现而不总是同时出现。
  • 只有帮助,如果可能,尝试用户配置文件并获得内存泄漏。
  • 我在浏览 macrumors.com 等常规网站时经常看到此错误。
  • 分析时,我觉得一切正常。内存会增加,直到下一次 GC 等等......而且它永远不会达到 iOS 资源限制。其他运行良好的 3D 网络应用程序给我同样类型的结果。

标签: javascript ios memory browser webgl


【解决方案1】:

如果没有看到您的代码,我无法保证有任何解决方案,但我可以提供一些有关内存问题的信息。

如果您确定它在第一次加载时不会崩溃,并且在清除设备内存后仍然崩溃,那么这不太可能是内存问题。话虽如此,如果您对此不确定,我建议您阅读更多有关 IOS 内存使用的信息。虽然每个设备的总内存是已知的,但实际可用内存为much smaller。此外,该帖子中显示的内存必须在设备上的所有应用程序之间共享,从而进一步限制了内存的可用性。

我发现即使在 2GB 的设备上,IOS 也会杀死使用 ~200-300 MB RAM 的应用程序,因为它分配得太快了。 IOS 在决定是否终止应用程序时会同时考虑分配的数量和速度。由于 Safari 中的每个选项卡都是单独运行的,因此很可能是相同的机制在起作用。您的 Web 应用程序可能会以如此快的速度将大量数据加载到 RAM 中,以致 IOS 拒绝执行请求。

我建议您在阅读有关 IOS 的真实内存限制后重新考虑您对内存使用的假设并再次分析应用程序。虽然它可能无法解决问题,但它至少可以确认内存是否是问题。

【讨论】:

  • 谢谢!是的,它在第一次加载时永远不会崩溃。你可能是对的,它不可能是内存问题。这正是我正在寻找的:它还能是什么,重启还有什么影响?这个simple 3D scene 在 iPad 上运行良好,即使它要求每帧 90 个 renderTargetTextures(379x890 大小)!当我剪切我的应用程序并且每帧只要求一个小的 renderTargetTexture 时,它​​会在我的应用程序中崩溃。所以它一定是内存以外的东西(但如果我不要求任何 renderTargetTexture,它可以工作,所以我迷路了哈哈)。
  • 不幸的是,这超出了我的专业范围,但如果它在重新启动后发生,听起来好像必须在设备本地存储一些东西。你曾经使用过 Safari 的 localStorage 功能吗?同样为了完成,您的应用在第一次加载时使用了多少内存?
  • 不,localStorage、sessionStorage、索引数据库和 cookie 完全是空的(我通过 Safari 上的远程调试解决了这个问题)。首次加载时加载的所有资源的总大小:19.5MB
  • 好的,我做了一些研究,不相信 Safari 会在本地保存任何内容,除非您明确告知它,因此可能值得关注 IOS 的兼容性问题,而不是重新启动时发生的情况。尤其是在您最近的更新中,您渲染纹理的方式似乎存在兼容性问题。这应该可以帮助您检查developer.apple.com/library/content/documentation/…
  • 不应该是兼容性问题立即崩溃而不是随机崩溃吗?不过谢谢,我会考虑所有可能性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多