【发布时间】: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