Error #3691: 超出此资源类型的资源限制。
错误代码位置为 view.rendre()。
away3D对贴图资源占用内存作出了限制
Resource | Number allowed | Total memory |
---|---|---|
Vertex buffers | 4096 | 256 MB |
Index buffers | 4096 | 128 MB |
Programs | 4096 | 16 MB |
Textures | 4096 | 128 MB¹ |
Cube textures | 4096 | 256 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源代码的情况下,基本上无解。只能通过其它途径来减少资源溢出的情况,比如降低贴图质量,及时清除资源占用,动态加载等方法。