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源代碼的情況下,基本上無解。只能通過其它途徑來減少資源溢出的情況,比如降低貼圖質量,及時清除資源佔用,動態加載等方法。