Flash插件10.1绘制曲线引发的性能问题
在as的一个绘图应用中由于有地方的计算数值的时候用到除法,而没有考虑除以0的问题,直接处理,造成得到的数值结果是无穷大Infinity,使绘图时占用大量的CPU。不过占用大量CPU的不是除以0的问题,是在绘制曲线是传入的坐标值是Infinity。
【问题出现】
在升级flash插件(到10.1 )时,发现原流量统计图在有些时候加载的时候很慢而且占用CPU100%很长时间,操作时候有重绘图时也是会出现同样的情况。
【问题原因】
在通过数组计算后的值绘制曲线时,有很多值是Infinity值。
【重现场景】
工具:Flex Builder 3,flash插件10.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
-
n=1/0;
-
trace(n);
-
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); } } } ]]>
-
</mx:Script> <mx:Canvas> <mx:Box id="lineBox"> </mx:Box> </mx:Canvas> </mx:Application>
运行结果:CPU占100%为在绘图的状况
同样的代码在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的异常处理跟其他的编程语言有些不同。