详细分析了FlashPlayer重绘
评论:深刻理解Flash Player重绘随着帧速率SWF内容的Flash播放器刷新需要改变的内容,和刷新的过程,我们通常称为重绘(重绘),相信也知道即使是初级菜鸟,只要使用调试版本的播放器,右键菜单会有;显示重绘区域(显示重绘区域)这个选项,当这个选项是开放的,我们可以清楚地看到这一幕被重绘区域。
如此说来,重绘
1,最常见的情况是,舞台上的视觉元素会触发重画的Flash播放器在形状、位置和状态(α,尺度变化…)。
2、当一个DisplayObject水平(childindex)的变化,也会导致重绘。
3,当你设定一个雪碧/影片剪辑buttonmode来真的,即使是单帧动画,重绘会触发mouseevent.mouse_down.or当你设置水平DisplayObject,即便DisplayObject不会改变,这将使Flash Player重绘对象显示。
由于重绘是可以更新的显示内容,Flash应用程序将不可避免地触发重画。主要来源是重绘的性能消耗,一个有经验的Flash开发人员编写的Flash应用,其性能可能是70%到90%(或更多)是在重绘的消耗,从而提高Flash应用效率和减少重绘有很大的关系。
为了减少重绘,首先我们需要确定每帧每帧大小的概念:重画应该取决于重绘的大小和面积。取决于一些(但不是全部)需要更新的对象的数目的视觉范围的显示,两个闪光点和宽度和高度20种情况,然后数调整为3,与总面积是指:20 * 20 * 3 = 1200(正方形像素)。
只看上面的公式,你认为计算重绘区域容易吗然后继续估计油漆区下面的案例。
如果你计算的结果是:20×20×6=2400(平方像素),那么你就错了…
根据以上的介绍,重新划定大小应该是重绘区域个数*单个区域的面积,但为什么这是错的吗让我们看看问题在哪里。
奇怪的地方出现。漆区数量仍然是3,和面积增加。根据地图上的坐标信息,我们可以很容易地计算出总粉刷面积大小:
20 *(70-20 + 20)* 3 = 4200(正方形像素),75%比预先估计的2400(正方形像素)!
也许从这个地方,每个人都开始感到困惑。的确,Flash Player的重绘区域还没有按照我们之前的假设计算的,但我们仍然可以找到一些规则。
如果你够细心,应该不难看出每个Flash Player的地区不会重画阶段3以上,三以上的显示对象需要重画甚至更多,Flash播放器将一个或多个集合(根据位置)在一起,然后重绘在一个大的区域其中,到目前为止,我们可以暂时超过两重绘区域规则和规则指定的三个最近的合并法,通过两总结规律,我们可以更容易地理解机制的Flash播放器的重绘,并解释了一些调试中遇到的日常重画的现象。例如,在QQ牧场一些小动物在一个区域重新划分,和一些动物否则重画。
当我们了解了重画,我们应该进一步了解如何避免不必要的重绘。下面列出的大多数方法可能对你很熟悉。
1,当一个动画显示对象时不显示,不仅是假有形财产,因为重绘依然在这里,你可以暂停动画选项,或使用removechild(DisplayObject)将直接从对象列表中删除。
2、不显示在可视范围内的物体外观的变化不改变,我相信,Flash本身的优化,是我stage.stagewidth和stage.stageheight为200,在显示对象上改变坐标(200, 200)宽高为10,而Flash Player重绘内容不包含该对象,一个新版本的Flash Player将关闭所有的重绘,即使浏览器窗口最小化,这个时候你往往会发现,CPU占用率大幅下降,但应用程序仍在运行。
3、设置DisplayObject的水平时,请先做一个判断:如果(mycontainer.getchildindex(我的孩子)!= 0)
{
mycontainer.setchildindex(孩子,0);
}
如果你幸运的话,这个判断可以带来200%的效率。
4、当你的精灵/影片剪辑设置cacheAsBitmap =真正的财产,当一个小的区域(或覆盖的对象)在显示对象的变化,这将导致重画整个雪碧/影片剪辑。
5,确保活动内容暂停在不可见区域,或者直接删除显示列表。看不见的区域,这里提到的不仅是外面看不见的阶段,但也显示对象被其他对象的阶段。如前所述,重绘是Flash播放器性能的主要消费者,所以优化和减少该地区的重绘区域,减少不必要的重绘操作的时候,它能带来巨大的性能优化返回。