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的异常处理跟其他的编程语言有些不同。

你可能感兴趣的:(Flash)