AS3 AIR:将大型位图添加到舞台时的加载时间
AS3 AIR: loading time when adding large bitmaps to stage
我正在使用 Flash Pro 为平板电脑制作一本简单的电子书。所有页面都是图像(库中的位图),大约有 80 张。为了保持大型平板电脑的良好质量,位图相当大 (3999x2999)。
这本电子书有垂直和水平滚动功能,这些都可以正常工作,但是;由于这些图像的数量和大小,我无法在应用程序启动时将它们全部添加到舞台上,所以我最终总是在滚动补间后只添加离当前页面最近的页面。
这工作正常,但在页面滚动后总是会导致延迟(旧平板电脑甚至几秒钟,而新 iMac 几乎是 1 秒,所以值得注意)。这基本上是我根据 image/page:
所做的
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?是的,你不能,所以有更好的方法来做这一切吗?
我很确定我正在用困难的方式来处理这里的某些东西,但就是不知道我应该做什么以及如何做。
移动设备上的 BitmapData 绘图速度太慢,无法即时使用,如果您必须使用它,请在应用程序启动时绘图(尽管仍然很慢)。 BitmapData blitting 稍微快一点,但仍然太慢,无法在移动设备上使用。
对于像您这样的大量资产,像 Starling 这样的 Stage3D 框架可能不是最佳解决方案,因为纹理上传也很慢并且内存量有限(达到限制时应用程序崩溃)。
最好是复制典型的 Android/Ios 开发用途:所有资产的分辨率都很少,至少为 1x 和 2x。
我个人使用 0.5x、1x、2x、3x 并开发了一个根据不同设置切换分辨率的框架(非常像 XCode 所做的)。但是您仍然可以在没有框架的情况下保持简单,只需在应用程序启动时设置您将用于该应用程序的资产解析。我还会确保根据需要在屏幕上删除和添加这些资产。
不要将 "new BitmapData" 与 "dispose" 结合使用。当您加载字节时,将其直接加载到舞台上已经存在的位图中。尝试通过加载-调整大小-显示管道对分配的内存进行尽可能少的修改。
移除像素并将其转储到渲染器上比更改现有像素要慢得多。
我正在使用 Flash Pro 为平板电脑制作一本简单的电子书。所有页面都是图像(库中的位图),大约有 80 张。为了保持大型平板电脑的良好质量,位图相当大 (3999x2999)。
这本电子书有垂直和水平滚动功能,这些都可以正常工作,但是;由于这些图像的数量和大小,我无法在应用程序启动时将它们全部添加到舞台上,所以我最终总是在滚动补间后只添加离当前页面最近的页面。 这工作正常,但在页面滚动后总是会导致延迟(旧平板电脑甚至几秒钟,而新 iMac 几乎是 1 秒,所以值得注意)。这基本上是我根据 image/page:
所做的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?是的,你不能,所以有更好的方法来做这一切吗? 我很确定我正在用困难的方式来处理这里的某些东西,但就是不知道我应该做什么以及如何做。
移动设备上的 BitmapData 绘图速度太慢,无法即时使用,如果您必须使用它,请在应用程序启动时绘图(尽管仍然很慢)。 BitmapData blitting 稍微快一点,但仍然太慢,无法在移动设备上使用。
对于像您这样的大量资产,像 Starling 这样的 Stage3D 框架可能不是最佳解决方案,因为纹理上传也很慢并且内存量有限(达到限制时应用程序崩溃)。
最好是复制典型的 Android/Ios 开发用途:所有资产的分辨率都很少,至少为 1x 和 2x。
我个人使用 0.5x、1x、2x、3x 并开发了一个根据不同设置切换分辨率的框架(非常像 XCode 所做的)。但是您仍然可以在没有框架的情况下保持简单,只需在应用程序启动时设置您将用于该应用程序的资产解析。我还会确保根据需要在屏幕上删除和添加这些资产。
不要将 "new BitmapData" 与 "dispose" 结合使用。当您加载字节时,将其直接加载到舞台上已经存在的位图中。尝试通过加载-调整大小-显示管道对分配的内存进行尽可能少的修改。
移除像素并将其转储到渲染器上比更改现有像素要慢得多。