AS3 AIR:将大位图添加到阶段

时间:2015-10-20 14:22:45

标签: actionscript-3 air

我正在为Flash Pro中的平板电脑构建一个简单的电子书。所有页面都是图像(库中的位图),其中大约有80个。为了保持大型平板电脑的良好质量,位图非常大(3999x2999)。

这本电子书有垂直和水平滚动,这些工作正常,但是;由于这些图像的数量和大小都很大,我无法在应用程序启动时将它们全部添加到舞台上,所以我最终在滚动补间之后总是只将最近的页面添加到当前页面。 这样可以正常工作,但是在页面滚动后总是会出现延迟(即使是使用旧版平板电脑几秒钟,而新版本的iMac几乎是1秒,因此值得注意)。这基本上就是我对每张图片/页面所做的事情:

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?是的你不能,所以有更好的方法来做这一切吗? 我很确定我在这里使用了很多东西,但是我无法弄明白我该怎么做。

2 个答案:

答案 0 :(得分:1)

移动设备上的BitmapData绘图速度太慢,无法动态使用,如果必须使用它,请在应用程序启动时进行绘图(尽管仍然很慢)。 BitmapData blitting有点快,但仍然太慢,无法在移动设备上使用。

对于像你这样的大量资产,像Starling这样的Stage3D框架可能不是最好的解决方案,因为纹理上传也很慢并且内存量有限(当达到限制时应用程序崩溃)。

最佳可能只是复制典型的Android / Ios开发使用:对于所有资产,最少1x和2x的几种不同分辨率。

我个人使用0.5x,1x,2x,3x并开发了一个框架,可以根据不同的设置切换分辨率(非常像XCode)。但是,如果没有框架,您仍然可以保持简单,只需在应用程序中设置您将用于应用程序的资产分辨率。我还要确保在需要时删除并在屏幕上添加这些资源。

答案 1 :(得分:0)

不要使用&#34;新的BitmapData&#34;与&#34; dispose&#34;一起使用。加载字节时,将其直接加载到舞台上现有的位图中。尝试通过load-resize-display管道尽可能少地修改已分配的内存。

将像素移除并转储到渲染器上要比改变已存在的像素慢得多。