away3D 资源溢出解决方案

来源:互联网 发布:学篮球的软件 编辑:程序博客网 时间:2024/06/08 01:04

 Error #3691: 超出此资源类型的资源限制

错误代码位置为 view.rendre()。


away3D对贴图资源占用内存作出了限制

ResourceNumber allowedTotal memoryVertex buffers4096256 MBIndex buffers4096128 MBPrograms409616 MBTextures4096128 MB¹Cube textures4096256 MB

解决方案①:减少贴图的使用,降低贴图的质量/分辨率


解决方案②:每次切换场景时,进行资源内存占用清除。


解决方案③:每次切换场景,进行资源清除并卸载swf,重新加载swf


方案一可以通过图片压缩工具,对贴图进行压缩。


方案二,调用方法,对所有附带贴图和骨架的对象,进行dispose()和removechild(),并且执行以下方法:

<span style="white-space:pre">import away3d.library.AssetLibrary;</span>
 <span style="white-space:pre"></span>public function resetAssets():void{try{AssetLibrary.removeAllAssets(true);}catch(e:Error){AssetLibrary.removeAllAssets(false);}System.gc();try{ trace("执行强制回收");new LocalConnection().connect("MoonSpirit"); new LocalConnection().connect("MoonSpirit"); }catch(error : Error){ } trace("应用程序使用的内存总量:"+System.privateMemory/1000000+"MB","内存分析");trace("q剩余内存:"+System.freeMemory/1000000+"MB","系统所分配并且已占用的的内存:"+System.totalMemory/1000000+"MB");}


以上做法可以大幅减少贴图资源的占用,大大减少资源溢出的发生。


如果在同一场景下,因为大量的贴图模型而造成的资源溢出,那只能按方案①的做法来解决。


方案三,把每一个场景做成swf,然后通过加载类加载swf,然后切换场景时就清除资源占用(要把该swf里面的引用都清空,否则卸载不了swf),并在卸载swf后,重新加载新的swf。


如果说,要做一个规模比较大的3D场景,并且对象种类多的情况下,可以通过动态加载的方式来实现,即只加载视野之内和视野外一定范围的对象,走到新的位置再加载新的对象,并把之前的对象资源占用清除。


总结:实际上,当今的电脑配置所能负荷的内存已经足够大了,但是away3d还是对资源内存作出限制,在没有away3d源代码的情况下,基本上无解。只能通过其它途径来减少资源溢出的情况,比如降低贴图质量,及时清除资源占用,动态加载等方法。



0 0