简短问题
我有一个bug,只有在重新启动设备后才会消失。我想知道在重新启动iOS设备时释放了什么,以便对我的bug有一定的了解。 释放我的缓存和我的RAM并不能帮助我修复我的bug,所以我想知道还有什么其他东西可以释放来暂时修复我的bug。
背景
我有一个使用WebGL和BabylonJS的web应用程序,在所有设备和浏览器上都可以正常工作,除了iOS。使用Safari时,我总是最终收到错误消息“发生了问题,因此重新加载了这个网页”。
这发生在运行iOS 10.3.3的iPad Air 2(2Go RAM)上,但我在我手中拥有的每个iOS设备上都看到了相同的bug。这就是为什么我认为这是与iOS相关的唯一原因。 我知道iOS资源限制:https://dev59.com/5WEh5IYBdhLWcg3ww11p#22193143
我已经尝试了数月调试此问题,这个bug会随机出现,有时很快,有时很慢。没有任何一致的东西,所以它是完全不可能进行调试的。
最好的猜测是这是一个内存问题,因为崩溃似乎每次出现得更快。而且因为错误消息几乎总是与内存问题相关联。我怀疑纹理和renderTargetTextures会占用越来越多的内存(但我不明白为什么它不会被释放,我没有保留无用的引用)。
但有一件事我很确定:当我重新启动我的设备时,它总是第一次工作(直到我重新加载一次,然后开始下降螺旋)。
如果我清除缓存(通过设置-> Safari)和我的RAM(在关闭屏幕时按home键),这个错误仍然存在。但是如果我重新启动我的设备,它就消失了。某些内存中的东西被释放了,我想知道是什么。
但我也可能完全错了,它可能是内存之外的东西,我对你们所有的建议都持开放态度。
提前感谢,这让我疯狂了数月!
更新:
这是JS Heap的样子:
更新2
在iOS上,每帧请求90个渲染目标纹理的场景(379x890像素)确实有效。 如果我不请求任何渲染目标纹理,则我的应用程序可以正常工作。但是,如果我只请求每帧一个小的渲染目标纹理,它会更快地崩溃。 从这个观察中能得出什么结论?这是否支持或否定了内存问题的想法?
更新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;
}
我可以坚持这段代码在更新2中发布的链接中有效,所以我认为这段代码不相关。唯一的问题是,注释掉应用程序的这部分似乎可以消除随机错误。 这段代码要求3D引擎在渲染到屏幕之前将其渲染到一个中介纹理中。因此,这段代码会影响每一帧。 在链接中,我要求引擎在渲染到屏幕之前将纹理渲染90次。
更新4:问题已解决
问题不取决于iOS重新启动时发布的内容,因此我无法回答自己的问题。但我可以说iOS不喜欢动态照明。 从现在开始,我们所有的项目都将在iOS设备上限制为一个光源。
更多的灯光,每帧计算量就越大。这对于iOS来说太多了,在短时间内要求太多的内存的应用程序将被终止。