away3D 資源溢出解決方案

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



發佈了21 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章