2017-09-01 74 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

相關問題