我爲一個網站使用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上測試它。
只要你釋放舊的,就不應該有任何限制。你需要釋放舊的?相反,你可以保持一個200紋理的池,只是加載新的數據(作爲解決方法) – gman
這實際上是一個很好的觀點......它實際上幫助擺脫了我得到的其他WebGL警告,但它沒有解決這個問題。我會繼續努力弄清楚。 –
你的圖像尺寸不同嗎?你有可能分裂內存嗎?例如,如果你有4mem的ram,並且你分配了4個1meg卡盤,那麼釋放第一個和第三個chunk,你會有2meg free,但是你不能分配2meg。我不知道司機是否能解決這個問題,但是不管是否在周圍洗牌。我假設你是否在做一些視頻,比如所有的紋理都是相同的大小,所以不是這樣。注意:這裏的小提琴測試分配大量的紋理:http://jsfiddle.net/greggman/YCBqe/ – gman