2017-09-01 71 views
3

简短问题重新启动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堆的样子:

JS Heap

更新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而言,杀死在短时间内要求太多内存的应用程序太多了。

+1

请显示一些代码,以便轻松调查问题。 – the4kman

+0

这是不可能的孤立错误,它随机出现。代码太大了。这就是为什么我不要求任何人修复我的错误,因为我不能显示任何相关的代码。抱歉。 由于它是一个WebGL应用程序,每帧都会生成和释放纹理。这可以解释为什么内存问题随机出现,并不总是在同一时刻。 – Nicolas

+0

只有帮助,尽可能尝试用户配置文件并获得内存泄漏。 –

回答

3

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

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

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

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

+0

谢谢!是的,它在第一次加载时从不崩溃。你可能是对的,它不能成为记忆问题。这正是我所期待的:还有什么可能,重启会有什么影响? 这个[简单的3D场景](https://www.babylonjs-playground.com/#H4PMHG#15)可以在iPad上正常工作,即使它要求每帧90个renderTargetTextures(379x890尺寸)! 当我削减我的应用程序,并只要求一个小renderTargetTexture每帧,它崩溃在我的应用程序。所以它必须不是内存(但如果我不要求任何renderTargetTexture,它的工作原理,所以我失去了哈哈)。 – Nicolas

+0

不幸的是,这在我的专业知识之外,但如果它在重新启动后发生,听起来像是必须在设备上本地存储的东西。你有没有使用Safari的localStorage功能?也是为了完成,你的应用在第一次加载时使用了多少内存? – Navillus

+0

不,localStorage,sessionStorage,Indexed Database&cookies完全是空的(我在Safari上通过远程调试了解了这一点)。 第一次加载的所有资源的总大小:19.5MB – Nicolas

相关问题