2013-10-04 55 views
1

我爲一個網站使用glfx.js圖像效果庫,其中我有一個畫布,而不是呈現不斷被新圖像替換的圖像,然後對其應用濾鏡。我可以在一個頁面會話中加載的WebGL紋理的數量是否有限制?

的問題是,運行(已經2300個左右不同的紋理加載之後)幾分鐘後WebGL的拋出這個錯誤:

WebGL: INVALID_VALUE: texImage2D: bad image data 

我已經收窄,這一功能:

Texture.prototype.loadContentsOf = function(element) { 
    this.width = element.width || element.videoWidth; 
    this.height = element.height || element.videoHeight; 
    gl.bindTexture(gl.TEXTURE_2D, this.id); 
    gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.format, this.type, element); 
}; 

調用gl.texImage2D()後,第2,300次WebGL拋出一個INVALID_VALUE錯誤,然後該頁面崩潰(使用Chrome的「Aw,Snap!」)。

我通過調用這個破壞紋理:

Texture.prototype.destroy = function() { 
    gl.deleteTexture(this.id); 
    this.id = null; 
}; 

是否有我可以在一個頁面上會話負載紋理的數量限制嗎?我只需要在內存中有大約200個,其他的我只是在使用後才銷燬。在我銷燬紋理後,WebGL是否不釋放內存?

爲了澄清這不是一個圖像本身的問題,這個錯誤也會發生,如果我只是加載相同的圖像多少次。

我正在最新的Chrome Canary上測試它。

+0

只要你釋放舊的,就不應該有任何限制。你需要釋放舊的?相反,你可以保持一個200紋理的池,只是加載新的數據(作爲解決方法) – gman

+0

這實際上是一個很好的觀點......它實際上幫助擺脫了我得到的其他WebGL警告,但它沒有解決這個問題。我會繼續努力弄清楚。 –

+0

你的圖像尺寸不同嗎?你有可能分裂內存嗎?例如,如果你有4mem的ram,並且你分配了4個1meg卡盤,那麼釋放第一個和第三個chunk,你會有2meg free,但是你不能分配2meg。我不知道司機是否能解決這個問題,但是不管是否在周圍洗牌。我假設你是否在做一些視頻,比如所有的紋理都是相同的大小,所以不是這樣。注意:這裏的小提琴測試分配大量的紋理:http://jsfiddle.net/greggman/YCBqe/ – gman

回答

1

我發現了這個問題。這與WebGL無關。加載圖像時出現內存泄漏問題。在我完成它們之後,我將紋理設置爲null,但不是Image對象。在我和他們一起完成後,只需添加img = null即可解決問題,並且Chrome不再崩潰。

令人困惑的是,Chrome在嘗試加載圖像時未發生錯誤,並且onload回調被調用的很好,但是當嘗試使用該圖像時它會崩潰。我將提交關於Chromium的錯誤報告,因爲我不認爲這是正確的行爲(當圖像無法加載時應該拋出一些其他錯誤)。

相關問題