2015-10-20 52 views
0

我正在爲Flash Pro中的平板電腦構建一個簡單電子書。所有的頁面都是圖像(庫中的位圖),其中大約有80個。爲了保持大片的質量,位圖非常大(3999x2999)。AS3 AIR:將大型位圖添加到舞臺時的加載時間

這本電子書有垂直和水平滾動,這些工作正常,但;由於這些圖片的數量和尺寸很大,我無法在應用程序啓動時將其全部添加到舞臺中,因此我最終只在滾動補間後纔將最接近的頁面添加到當前頁面。 這工作正常,但會導致頁面滾動後總是延遲(舊平板電腦甚至幾秒鐘,而新的iMac幾乎是1秒,所以它是值得注意的)。這是basicly我每做圖像/頁:

var bitmapdata:BitmapData = new bitmapArray[i](); //linkage name 
var hRatio:Number = stage.stageHeight/bitmapdata.height; 
var bitmap:Bitmap = BitmapScaled(bitmapdata, bitmapdata.width * hRatio, bitmapData.height * hRatio); 
target.addChild(bitmap); //target is a MovieClip (I have one Mc for each vertical pile of pages) 

而且BitmapScaled功能:

function BitmapScaled(source0:BitmapData, width0:Number, height0:Number):Bitmap{ 
    var mat:Matrix = new Matrix(); 
    mat.scale(width0/source0.width, height0/source0.height); 
    var bmpd_draw:BitmapData = new BitmapData(width0,height0,false); 
    bmpd_draw.drawWithQuality(source0,mat,null,null,null,true,StageQuality.BEST); 
    return new Bitmap(bmpd_draw); 
} 

另外,滾動後我清理不相鄰的新的當前頁面的那些:

function clear(targetArray:Array):void{ 
    for(var i:int = 0; i<targetArray.length; i++){ 
    targetArray[i].bitmapData.dispose(); 
    targetArray[i].bitmapData = null; 
    targetArray[i].parent.removeChild(targetArray[i]); 
    targetArray[i] = null; 
    } 
    if(targetArrays[targetArrays.indexOf(targetArray)] = new Array(); 
} 

多久一次: 水平滾動後,我添加一個新的水平頁面和一個新的垂直頁面,並刪除一個水平頁面和至少一個垂直頁面。 垂直滾動後,我只添加一個新的垂直頁面(如果下一個垂直頁面是我已經沒有添加的頁面),所以垂直頁面我保持在舞臺上,直到下一個水平滾動發生。這需要較小的延遲,但也值得注意。

我知道Flash/AIR不是最好的方式,但現在我擁有了。我怎樣才能擺脫addChild-delay?是的,你不能,所以更好的方法來做這一切? 我很確定我在這裏用了一些很難的方法,但只是無法弄清楚我應該怎麼做。

+0

實際所用時間在哪裏?在你的BitmapScaled函數或實際的addChild函數中? – SushiHangover

+1

不要在移動設備上繪製位圖數據,此操作對於大型位圖而言太慢,1秒或更長,具體取決於設備。您的資產必須在需要之前準備好顯示。 – BotMaster

+0

@BotMaster謝謝,這當然解釋了原因。我是否應該像現在一樣將它們變成Mc's和addChild/removeChild,還是僅僅調整它們的「可見」屬性就足夠了,而所有這些屬性都已經添加到舞臺上了?或者我應該嘗試更好的方法?任何好的,如果我畫的開始,只是addChild/removeChild最終的位圖? – kaarto

回答

1

移動設備上的BitmapData繪圖太慢而無法動態使用,如果您必須使用它,請在應用程序啓動時進行繪製(儘管速度仍然很慢)。 BitmapData blitting速度稍快一些,但仍然太慢而無法在移動設備上使用。

由於擁有大量資產,就像您的情況一樣,Stage3D框架(如Starling)可能不是最好的解決方案,因爲紋理上傳速度也很慢並且內存量有限(當應用程序崩潰時限制)。

最好的可能就是複製典型的Android/Ios開發使用:對於所有資產至少有1x和2x的幾乎不同的分辨率。

我個人使用0.5x,1x,2x,3x,並開發了一個根據不同設置切換分辨率的框架(非常類似於XCode)。但是,如果沒有框架,您仍然可以保持簡單,並且只需在應用程序中啓動您將用於該應用程序的資產解析。我還會確保在需要時刪除並在屏幕上添加這些資產。

0

請勿將該「新BitmapData」與「dispose」結合使用。當你加載你的字節時,直接將它加載到舞臺上已經存在的位圖上。儘量通過load-resize-display管道盡可能少地修改分配的內存。

將像素移除並轉儲到渲染器上比改變已存在的要慢得多。