Flash插件10.1绘制曲线引发的性能问题

      在as的一个绘图应用中由于有地方的计算数值的时候用到除法,而没有考虑除以0的问题,直接处理,造成得到的数值结果是无穷大Infinity,使绘图时占用大量的CPU。不过占用大量CPU的不是除以0的问题,是在绘制曲线是传入的坐标值是Infinity。

【问题出现】

      在升级flash插件(到10.1 )时,发现原流量统计图在有些时候加载的时候很慢而且占用CPU100%很长时间,操作时候有重绘图时也是会出现同样的情况。

【问题原因】

      在通过数组计算后的值绘制曲线时,有很多值是Infinity值。

【重现场景】

      工具:Flex Builder 3,flash插件10.1。

      测试代码:

显示行号 复制代码
  1. <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="Init()">
        <mx:Script>
            <![CDATA[
                private var n:Number=10;
                
                private function Init():void{
                    //测试除以0,得到的结果是Infinity
  2.                 n=1/0;
  3.                 trace(n);
  4.                 var i:int;
                    lineBox.graphics.lineStyle(1,0xFF0000,0.75);
                    for(i=0;i<1000;i++){
                     //每2像素绘制一条曲线
                        if(i%2==0){
                            lineBox.graphics.moveTo(i,0);
                            lineBox.graphics.lineTo(i,n);
                        }
                    }
                }
                
            ]]>
  5.    </mx:Script>
        <mx:Canvas>
            <mx:Box id="lineBox">        
            </mx:Box>
        </mx:Canvas>
    </mx:Application>

 

      运行结果:CPU占100%为在绘图的状况

image

       同样的代码在Flash10.0版本执行是没有问题的,不会占用到100%的CPU。

【相关知识】

 

 

1、在ActionScript语言,除以0是不会抛出异常,直接返回Infinity。

2、Infinity*0=NaN;Infinity*(正数)=Infinity;Infinity*(负数)=-Infinity;

3、graphics.lineTo(x,y)方法传入Infinity值也不会抛出异常,在10..0不会占用大量CPU,而在10.1会占用100%的CPU

4、ActionScript的异常处理跟其他的编程语言有些不同。

posted @ 2010-06-25 21:27  Asharp  阅读(779)  评论(0编辑  收藏  举报