내 앱에 150 개의 HD 이미지를로드하고 있습니다. 기본적으로 오브젝트의 3D보기입니다. 일단 Loader
인스턴스를 사용하여 이미지 파일을로드하면 로더의 첫 번째 자식의 비트 맵 데이터를 Vector에 저장합니다. 로드가 모두 끝나면 객체를 "회전"하기를 원합니다. = 단순히 이미지를 교환하는 것입니다. 나는 Vector를 가져 와서 비트 맵 데이터를 가져 와서 캔버스 비트 맵 데이터에 하나씩 그립니다. 거기에는 과학이 없으며 모든 것이 의도 한대로 작동합니다.이미지를로드해도 메모리에로드되지 않습니다.
문제는 일단 모든 이미지가 벡터에로드되고 저장되면 캔버스에 그려지기 전에 메모리에 저장되지 않는다는 것입니다. 즉, 내 3D 오브젝트의 첫 번째 회전 (-> 150 개 이미지 모두 그려짐)이 실제로 느려진다는 것을 의미합니다. 첫 번째 회전 후에 문제가 없으며 모두 유동적입니다. 제 질문은 : 무대에 그림을 그리지 않고 이미지를 강제로 메모리에로드하는 방법이 있습니까? 나는 그들이 앱에로드되면 메모리에로드 될 것이라고 예상했다 (Wrong!).
동일한 결과를 캔버스 비트 맵에 그리는 대신 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
추신 : 렌더링 비트 맵은 표시 목록에 있어야하며 반드시 표시되어야합니다. 그렇지 않으면 작동하지 않으므로 addChild/removeChild가이 경우 선택적이 아닌 것처럼 보입니다. (그래서 그냥 주 캔버스에 렌더링 될 수 있습니다). – Fygo
흥미 롭습니다. 좋아, 다행이야. – Vesper