我正在将一批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