提高程序性能的几点基本要求

1.这个隐患的防范首当其冲: break;语句的使用。

 全世界的很多程序的重大错误绝大多数都来于此。

 甚至,在Big C++这本书的开始,作者就强调,若非实在不得已,不准使用break;语句。

 我经常提醒自己,不要落入此陷阱,但是有时依然难逃虎口,而且每一次都是大麻烦,查找半天才找到错误。

 break;语句在很多地方会被用到。主要用在switch和for相关的代码块内。假设这个break;语句忘记写了,或者写错了。那么它引起的错误将具有高隐蔽性和高伤害能力。 因此建议在程序中尽量少用break;如果用的时候,一定要注意检查是不是在该有break的地方漏写了,更不要写错地方了。

甚至要强调,在开发的时候需要标注出那些类中用到了switch/break;

 

2.在条件表达式中,如果要做浮点值的比较,尽量避免使用 xNum == 0(xNum是一个浮点值变量)的条件表达式。

  因为很多时候你的xNum可能很小例如0.0000000000001但是它仍然不是0,那么在此种情况下,程序会难以达到预期的目的而出现莫名其妙的问题。再说很多时  候因为运算的精确度不需要真的得到0这个值,因此只需要让xNum的绝对值小于某一个值(例如0.00001)即表示其值为0。这样做其实在无需高精度计算的情况下就保证的程序的精准,健壮。这里建议在你的framework中定义一个常量:ZERO来表示你这里可以接受的"0"的数值,例如在as3中可以定义为:var ZERO:Number = 0.0001;

 

3.在as的编程中很多时候都会接触到视觉编程。而很多时候,你所生成的视觉对象又会因为某种原因需要将其从显示列表中移出。移除一个显示对象的基本做法是:

  parentObj.removeChild(childObj);但这种做法有很大的局限性和不安全的因素。解决这个问题的一个办法就是在显示对象自身中提供一个移出自身的方 法:removeThis().外界要删除这个显示对象只需执行这个方法即可:instance.removeThis();

  这里举例如下:

  例子1:

  package{

    import flash.display.Sprite;

    public class SubSpr extends Sprite{

      pubic function SubSpr(){}

      //初始化相关

      public function initState():void{

      }

      public function removeThis():void{

        //注意: 在这个方法里将自身实例和别的实例会对象相关联的引用、数据等要一并清除。

        if(parent != null){

          parent.removeChild( this );

        }

      }

    }

  }

 

 

  例子2:

  package{

    import flash.display.Sprite;

    public class SubSpr extends Sprite{

      private _parentSpr:Sprite = null;

      pubic function SubSpr(){}

      //初始化相关

      public function initState(parent_spr:Sprite):void{

        parentSpr = parent_spr;

      }

      public function removeThis():void{

        //注意: 在这个方法里将自身实例和别的实例会对象相关联的引用、数据等要一并清除。

        if(_parentSpr!= null){

          if(_parentSpr.contains(this)){

            _parentSpr.removeChild( this );

          }

          _parentSpr = null;

        }

      }

    }

  }

 

当然,要想完全移除这个显示对象,那还要要保证外界再也没有对这个对象的引用存在。

上面例子的做法保证显示对象移除的处理由其自身来完成,将移除自己的实际操作仅仅暴露给自己也因此会被自己完全掌控。当然这里只是介绍了基本的一些做法,还有更多的东西需要在实际中添加进来。

实际上,我们在移除对象的这个对象不仅仅是指显示对象,其他的逻辑对象一样可以用上面的操作来完成,这样除了程序安全可控性提高之外可以保证你的所有具有此行为的对象不论是不是显示对象,都会提供给外界一个可供操作的共同行为。

 

4.尽量不要在构造函数中做初始化操作,要将初始化放在构造函数之外,而且要做到其需要用的时候才初始化。

 

5.在as3编程中,因为as3的机制中自带了事件机制所以就给了很多懒人随意使用看起来无所不能的事件提供了温床。过多的使用事件或不当的滥用事件,只会使你的程序结构差,效能低,健壮性就不要谈了,安全隐患也会随之而来。as3提供的事件机制的初衷是解决用户和系统通讯的,但是很多人尽然将其用在程序架构上了。更有人说,不用事件怎么降低程序间的耦合性,真是...。天下没有免费的午餐,这个规则在这里依旧适用。事件的易用并不代表他能随意用在任意的地方,用的不对,或用的过多都要付出代价。

  as3程序是面向对象的编程模式,不要让面向对象的这种优势被事件机制给淹没了。继承,接口,覆盖等等他们所带类的优越性,不是几个事件就能赶得上的,而且事件所能做到的,只要是用户自己实现的程序,面向对象的基本机制都能完成。


6. 尽量少创建运行时对象,无论这个对象使系统自带的还是自定义的都要尽量少创建.在游戏编程中尤其重要(例如3D游戏中的相关编程)。同理如果不是非常需要就要重复利用,因为移除对象照样会消耗cpu.在flash游戏中,宁可以内存换取cpu(并不是说乱用内存)。内存的管理虽然在flash中式间接实现的,但是其非常极其重要,除非你仅仅做小东西。 

 

...

 

 

posted @ 2009-12-14 10:04  vily_雷  阅读(260)  评论(0编辑  收藏  举报