《关于Flash Player的重绘机制》

重绘(redraw)的定义:Flash Player 会以SWF内容的帧频速度来刷新需要变化的内容,而这个刷新的过程,我们通常称为“重绘(redraw)”.
【重绘是Flash Player性能消耗的主要根源】

发生重绘的情况:
①舞台上的可视组件的形状、位置、状态(alpha, scale…)等发生改变.
②当一个DisplayObject的层级(ChildIndex)发生改变.
③Sprite / MovieClip 的buttonMode 设置为 true ,重绘会在MouseEvent.MOUSE_DOWN的时候触发.

如何减少重绘:
①带有动画效果的DisplayObject在不显示时,暂停该DisplayObject,或者利用removeChild(displayObject) 直接将此对象移除出显示列表.
②将DisplayObject对象转移到FlashPlayer的不可视范围里,FlashPlayer将不对其进行重绘,这里的不可视范围除了舞台以外,还包括被其他物体遮盖住的显示对象.
③在设置DisplayObject的层级的时候请先做一个判断:
if(myContainer.getChildIndex(myChild) != 0)
{
myContainer.setChildIndex(myChild, 0);
}
④当你的Sprite / MovieClip 设置 cacheAsBitmap = true 这个属性的时候,当此显示对象内很小的一个区域(甚至是被遮盖着的物体)发生变化,会导致整个Sprite / MovieClip重绘,当 cacheAsBitmap = true 遇上 scrollRect 属性,也可减小重绘区域.

如何强制重绘:
①使用updateAfterEvent()方法.
引用YouYee的一句话:重绘是Flash Player性能消耗的主要大户,所以去优化减小重绘区域面积,减少不必要的重绘操作次数,往往能够带来比较大的性能优化回报

Any More:
单纯的理论可能难以让人理解,下面是我写的一个贝塞尔曲线的例子:
在这个例子中,如果你的FP版本是Debug版本的话,你右击鼠标点”显示重绘区域“,就会发现重绘的改变过程是有多么的美妙和奇妙,当舞台放大时,你会 发现旋转变慢了CPU资源占用变大了,而当舞台变小时,你就会发现旋转变快了CPU资源占用变小了(测试环境,本地FP播放,手动拉伸FP播放器,前提是 设置舞台的StageScaleMode为EXACT_FIT)…

下面是这个程序例子的关键代码,大家点击这里也可以通过我Google Code代码库浏览:
[cc lang="actionscript"]package com.norris2u4.components
{
import flash.display.Sprite;
import flash.events.TimerEvent;
import flash.filters.GlowFilter;
import flash.geom.Point;
import flash.utils.Timer;

public class BezierCurve extends Sprite
{
/* 属性 */
private var _radius:int=70; // 定义半径
private var _numberPoint:Number=30; // 定义点的数量
private var _points:Array;
private var _pre_r:Number=0.000314159;
private var _radians:Number=0;
private var _centX:Number; // X坐标的位置
private var _centY:Number; // Y坐标的位置
private var _timer:Timer; // 创建刷新用的计时器
private var _color:uint; // 对象的颜色
private var _gf:GlowFilter; // 使对象产生发光效果
private var _loc_1:int;
private var _loc_2:Point;

/* 构造函数*/
public function BezierCurve(_x:Number, _y:Number)
{
super();
//在此初始化数值
_color=0x3377dd; // 初始化【颜色】
_centX= _x; // 初始化【X】坐标
_centY= _y; // 初始化【Y】坐标
_gf=new GlowFilter(); // 初始化【发光效果】,颜色为0x00ffff
_gf.blurX=_loc_1; // 初始化【水平】模糊量
_gf.blurY=32; // 初始化【垂直】模糊量
_gf.color=_color; // 初始化【光晕颜色】
filters=[_gf]; // 着色器
_points=new Array(); // 初始化一个数组,用以
/* 以下为 —— 启动刷新计时器 */
this.addEventListener(Event.ENTER_FRAME, onEnterFrame); // 启动计时器
/* —— 结束计时器 */
}

/* 方法 */
private function onEnterFrame(event:TimerEvent):void
{
// 刷新后的动作
// trace(“成功执行Timer”);
run(); //进行一个run动作

}

private function run():void
{
this.graphics.clear(); // 清除绘制到此 Graphics 对象的图形,并重置填充和线条样式设置
_points=[];
_radians=_radians + _pre_r;
_loc_1=0; // 设置水平模糊变量
// ——————————————- Begin While ——————————————-
while (_loc_1 < _numberPoint)
{
_loc_2 = new Point(); // 每执行一次while都新建一个Point数组
_loc_2.x = _centX + Math.cos( _radians * _loc_1) * 140;
_loc_2.y = _centY + Math.sin( _radians * _loc_1) * 140;
_points.push(_loc_2); // 将一个或多个元素添加到数组的结尾,并返回该数组的新长度
_loc_1 += 1;
}
// ------------------------------------------- End While -------------------------------------------
this.graphics.beginFill(_color, 0.2);
this.graphics.lineStyle(1, _color , 0.8); // 设定线条颜色
this.graphics.moveTo(_centX, _centY); // 移动
_loc_1 = 2;
while (_loc_1 < _numberPoint - 2 )
{
this.graphics.curveTo(_points[_loc_1 - 1].x, _points[_loc_1 - 1].y, _points[_loc_1].x, _points[_loc_1].y);
this.graphics.curveTo(_points[_loc_1 + 1].x, _points[_loc_1 + 1].y, _centX, _centY);
_loc_1 += 1;
}
this.graphics.endFill();
//绘制贝塞尔曲线
}
}
}[/cc]

2010年4月15日更新:
很希望在这里分享一下林晓伟先生关于FP机制的文章,关于可变跑道这个概念,相信很多Flasher都重未接触过吧,可变跑道,原名为Elastic Racetrack,它是Flash Player的帧执行模型,如下图<转自林晓伟先生的博客>:

在Flash Player执行一帧的周期里,前一部分时间用于执行代码,剩余时间用于渲染显示列表中的对象。每个执行阶段都可以根据实际需求增加执行时间来执行更多代码或做更多的渲染工作,而跑道的总长度也将相应增长。 —— 林晓伟
关于AVM2,大家都知道它比AVM1的执行效率高出了10倍,但大家是否知道,在Flash Player里面,AVM2是受谁来管的呢?Marshal就是操控AVM2的元帅级组件,Marshal的职责就是“将时间切割成Flash Player工作所依的基本时间片”,

夜深人静,明天继续补充….

— — 华 丽 的 分 割 线 — —
【相关文章】

1、《深入理解重绘Flash Player重绘》 ——    YouYee(腾讯)
2、《 Flash Player统一代码库及其挑战》 —— 林晓伟(Adobe)
3、《执行模型之可变跑道》 —— 林晓伟(Adobe)

–本贴将不断补充完善


转自:http://www.norris2u4.com/?p=228

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值