我正在將一批150張HD圖像加載到我的應用程序中 - 它基本上是一個對象的3D視圖。一旦我使用Loader
實例加載圖像文件,我將加載器的第一個孩子的位圖數據存儲在Vector中。當所有的加載,我想開始「旋轉」的對象=意味着我只是交換圖像。我將矢量放在我有位圖數據的位置,然後依次將它們繪製到畫布位圖數據上。那裏沒有科學,一切都按預期工作。加載圖像不會將它們加載到內存中
問題是,一旦所有的圖像加載並存儲在一個向量中,並且在它們被繪製到畫布之前,它們不在內存中。這意味着3D對象的第一次旋轉( - >所有150個繪製的圖像)非常慢。第一次旋轉後沒有問題,並且都是流體。我的問題是:有沒有辦法強制圖像加載到內存中而不會將它們拖到舞臺上?我預計,一旦它們加載到應用程序,它們就會被加載到內存中(錯誤!)。
我試圖使用addChild()而不是將它們繪製到畫布位圖,結果相同。我不認爲代碼是必要的,但以防萬一:
private var _loaders:Vector.<Loader>;
private static const NAME:String = "img_00";
private static const MIN:uint = 0;
private static const MAX:uint = 150;
private var _loaded:uint = 0;
private var _currentFrameIndex:uint = 0;
private var _canvas:Bitmap;
private var _bitmaps:Vector.<BitmapData>;
private var _destPoint:Point;
public function loadImages():void {
var s:String;
for(var i:int=MIN; i<=MAX; i++) {
if(i < 10) s = "00" + i;
else if(i < 100) s = "0" + i;
else s = i.toString();
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loadHandler);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loadHandler);
loader.load(new URLRequest("images/JPEG/"+ NAME + s + ".jpg"));
_loaders.push(loader);
}
}
private function loadHandler(e:Event):void {
_loaded++;
if(_loaded > (MAX - MIN)) {
_bitmaps = new Vector.<BitmapData>(_loaders.length);
for(var i:int=0; i<_loaders.length; i++) {
var loader:Loader = _loaders[i];
_bitmaps[i] = Bitmap(loader.getChildAt(0)).bitmapData;
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loadHandler);
loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, loadHandler);
loader.contentLoaderInfo.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, loadHandler);
}
setFrame(0);
dispatchEvent(new Event(LOAD_COMPLETE));
}
}
public function setFrame(frame:uint):void {
if(frame >= 0 && frame < _bitmaps.length) {
_currentFrameIndex = frame;
var bmpData:BitmapData = _bitmaps[_currentFrameIndex];
_canvas.bitmapData.copyPixels(bmpData, bmpData.rect, _destPoint);
}
}
我猜測它正是這樣 - 圖像還沒有解碼(將解釋內存使用情況和緩慢)。好吧,太糟糕了,我想用戶將不得不等待更多。謝謝! – Fygo
PS:渲染位圖務必在顯示列表上,它必須是可見的。否則它將無法工作,因此在這種情況下,addChild/removeChild看起來不是可選的。 (所以它可以在主畫布上呈現)。 – Fygo
有趣。好吧,我很高興你有這個。 – Vesper