【发布时间】:2014-02-22 01:02:30
【问题描述】:
我正在将一批 150 张高清图像加载到我的应用程序中 - 它基本上是一个对象的 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);
}
}
【问题讨论】:
标签: actionscript-3 memory bitmap bitmapdata