FlashPlayer
Flash渲染机制 Flash内幕深入了解Flash运行机制代码的执行频率可能比swf的帧率更高,播放一个lfis的swf文件,播放一帧时间为1秒,也就是50个时间片,但在每个时间片里,都会有触发鼠标或计时器事件,尽管只有最后个时间片才会渲染,另外你可以选择通过调用函数 updateAfler Evento提前渲染,但只能在鼠标,计时器和键盘事件处理函数中调用。在这种情况下, Mars hal会认为当前帧已结束从下一个时间片起进入下一帧。最后,如果一个 Sprite的外观属性比如 width. heigh等发生变化而将鼠标从该 Sprite上方掠过, Flash会进行强制渲染如果帧率不是每秒时间片数量的整数因子,那么该平台的渲染时间间隔将变得不固定,比如咴率20ps的swf运行在50个时问片每秒的系统上, Flash Player的行为将是每5个时问片播放两帧,那swf的渲染频率将是2-3-2-3-2-3(时间片)使用位图缓存功能可实现良好的优化。此功能缓存矢量对象,将其作为位图在内部呈现,并使用该位图进行呈现。此结果会显著提高呈现的性能,但需要占用大量内存。针对复杂的矢量内容使用位图缓存功能,如复杂渐变或文本。为包含复杂的矢量图形(例如文本或渐变)的动画对象打开位图缓存可提性能。但是,如果在显示对象(如播放其时闩轴的影片剪辑)中启用了位图缓存,您将获得相反的效果。在各个帧上,运行时必须更新缓存的位图,然后在屏幕上重绘该位图,这一过程需要许多CPU周期。仅当缓存的位图可以一次牛成,且随后无需更新即可使用时,才适合使用位图缓存功能。为 Sprite对象打开位图缓存后,移动该对象不会使运行吋重新生成缓存的位图。更改对象的ⅹ和y属忙不会导致重新成。然而,任何试图旋转、缩放对象或更改其 alpha值的行为都将导致运行时重新生成缓仔的位图,从而降低性能注:AR和 Packager for iPhone中提供的 DisplayObject cacheAsBitmap Matrix属性没有此限制。通过使用cacheAsBitmapMatrⅸ属性,您可以旋转、缩放、倾斜显示对象以及更改其 Alpha值,而不触发重新生成位图。缓冇位图占用的内存大于常规影片剪辑实例。例如,如果舞台上的影片剪辑为250x250像素,缓存它可能会使用250KB内存,而木缓存它只需1KBlash Player10.和AR2.5优化内存使用的方法与第17页的“滤镜和动态位图卸载”中介绍的方法相同。如果隐癜缓存的显示对象或将其置于屏幕之外,则在一段时间未使用后释放其位图占用的内存。注:如果将显示对象的 opaqueBac kground属性设置为特定颜色,运行时会将显示对象视为不透明。当运行时与 cache As Bitmap属性一起使用时,它将在内存中创建一个非透明的32位位图。将 alpha通道设置为0xFF可提高性能,因为在屏幕上绘制位图时不要求透明度。避免使用 alpha混合可提高呈现速度。如果当前屏幕深度限制为16位,则内存中的位图会存储为16位图像。使用 opaqueBackground属性不会隐式激活位图缓存。要节省内存,请使用 cacheS Bitmap属性,并对每个显示对象而不是容器激活该属性。对容器激活位图缓存会导致最终位图占用更多内存,从而创建一个尺寸为211x279像素的透明位图。此图像大约占用229KB内存请记住,如果不在各个帧上旋转、缩放或更改缓存的内容,则位图缓存可提高呈现效果。但是,对」Ⅹ和Y轴上的平移之外的任何转换,则不会提高呈现性能。在这些情况下,每次在显示对象上发生转换时, Flash Player都将更新缓存的位图副本。更新缓存副木会导致占用大量CPU、降低性能以及消耗大量电池电量。同样,AIR或Packager for iPhone中的cacheS BitmapMatrⅸx属性也没有此限制渲染优化在 ash渲染中使用 Bitmap进行绘制的效率要高」 Sprite和 MoviEclip。在 Bitmap对像素进行操作时一般使用setPⅸelO,setPⅸel320, set vector(0几种方式,下面根据渲染效率从低到晑列出3种不同写法public static const MAX: int=10000private function set Bitmap DataTestIo: voidvar index int= maXvars: int=getTier()while(--index!-=o)for(var i int =40; 1<60; ++1for(var j int=40:<60;++j)dataB. setPixel(i,j, Oxff0000)trace(get Timer(-S);private function set BitmapData'Test20: voidvar index int MAX:vars: int=get imerO)while(--index !=0)dataB. lockOfor(var i: int=40: i<60; ++1)int=40;j<60;++j)dalaB setPixel(i,j, Ox[10000)trace(get Timer(-s):private function set Bitmap DataTest30 voidvar index: int MAX:ar s: int=gctTimcrovar rect: Rectangle-new Rectangle( 40, 40, 20, 20)while (--index !=0)pixels: Vector -new Vector (400, true)for (var i: int=0; 1<400; i++)pixelsi-Oxffff00ocdataB. set Vector(rect, pixels)trace(get Timero-S:以上三种方式实现效果完全一样,在使用 setpixel)时需要注意对 Bitmapdata进行bock和unlock的操作。 set vector()的合玛使用效率明显高于setPⅸxel(。
用户评论