按我的理解,在 WebGL 环境下,贴图资源的释放存在天生的难点…… 我想和大家分享下我的看法,如果不对欢迎指正。
每个贴图(Image)都需要绑定到显存中(gl.bindTexture)才能渲染,绑定后会占用显存。显存是宝贵的,需要尽可能及时释放(gl.deleteTexture)。
用户可以在 JavaScript 中任意持有某贴图的引用(WebGLTexture),浏览器如果释放了该贴图,之后用户还要再次使用时就会出错。
为了避免出错,浏览器需要判断用户是否仍然持有该贴图。但是主流的 JS 引擎并不采用引用计数,无法自动判断出是引用什么时候为零。只有等到 GC 的时候才知道贴图没有引用了。但是有些游戏内存管理得好的,GC 可能一直不触发。而且出于安全性等原因,浏览器并不允许用户主动执行 GC(类似 Unity 的 UnloadUnusedAssets),所以浏览器最终还是没办法及时的知道该贴图什么时候能安全释放。
这就导致了贴图释放这件事情,完全需要用户来主动校验。因为浏览器都做不到的事情,Creator 也没办法做到。
一个比较合理的解决方法就是,当用户再一次使用一张已经释放了的贴图时,Creator 提供温和的报错信息,引导用户主动复查前期的释放操作。并且根据贴图 url,重新再下载一次,延迟到显存重新绑定好后才进行渲染。
