简短问题重新启动iOS设备时发布了什么?
我有一个错误,只有当我重新启动我的设备时才会消失。我想知道什么是重新启动iOS设备时才能知道我的错误是什么。 发布我的缓存和我的RAM并没有帮助修复我的错误,所以我不知道还有什么可以在短时间内修复我的错误。
背景
我有使用WebGL和BabylonJS一个Web应用程序。它在除iOS之外的所有设备和所有浏览器上工作得很好。对于Safari,我总是会收到错误消息“此网页出现问题,因此重新加载”。
它发生在运行iOS 10.3.3的iPad Air 2(2Go RAM)上,但是我看到了每个iOS设备上可能出现的错误。这就是为什么我认为它只与iOS相关。我知道关于iOS的资源限制:https://stackoverflow.com/a/22193143/5053300
我试图调试几个月,错误出现随机,有时很快,有时慢。没有什么一致的,所以完全不可能调试。
最好的猜测是它是一个内存问题,因为崩溃似乎每次都会显得更快。并且因为错误消息总是与内存问题相关联。
我怀疑纹理和renderTargetTextures采取越来越多的内存(但我不明白为什么它不会被释放,我不保留无用的引用)。
但有些事情我确定:当我重新启动我的设备时,它总是第一次工作(直到我重新加载一次,然后开始下降螺旋)。
如果我清理缓存(通过设置 - > Safari)和我的RAM(当我们在关闭屏幕时按下home按钮),错误仍然存在。但是,如果我重新启动我的设备,它会消失。 内存中的东西被释放,我想知道什么。
但我也可能是完全错误的,它可能是内存以外的东西,我愿意接受你的所有建议。
在此先感谢,它让我疯狂了好几个月!
UPDATE
这是JS堆的样子:
更新2
一个scene asking for 90 renderTargetTextures(379x890),每帧做iOS上的工作。 如果我不要求任何renderTargetTextures,我的应用程序就会工作。但是如果我只是要求每一帧有一个小的renderTargetTexture,它会快速崩溃。 从这个观察中我能得出什么结论?它是否证实或否认记忆问题的想法?
更新3
有没有线索下面的代码确实是问题的原因,但评论/取消注释它generaly使消失/出现的bug。
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次渲染到纹理之前渲染到屏幕。
UPDATE 4:问题解决
的问题并不取决于什么是iOS上的重启发行,所以我不能回答我自己的问题。但我可以说iOS不喜欢动态照明。 从现在起,我们所有的项目都将限制在iOS设备上。
更多的灯光,更多的计算每帧。对于iOS而言,杀死在短时间内要求太多内存的应用程序太多了。
请显示一些代码,以便轻松调查问题。 – the4kman
这是不可能的孤立错误,它随机出现。代码太大了。这就是为什么我不要求任何人修复我的错误,因为我不能显示任何相关的代码。抱歉。 由于它是一个WebGL应用程序,每帧都会生成和释放纹理。这可以解释为什么内存问题随机出现,并不总是在同一时刻。 – Nicolas
只有帮助,尽可能尝试用户配置文件并获得内存泄漏。 –