Linux系统编程之C 游戏程序优化(1)

文章作者 100test 发表时间 2007:03:14 16:39:44
来源 100Test.Com百考试题网


一般而言,比起C程序来说,C 游戏程序是可重用和可维护的。可这真的有价值吗?复杂的C 可以在速度上与传统的C程序相提并论吗?

如果有一个好的编译器,再加上对语言的了解,真的有可能用C 写出一些有效率的游戏程序来。本文描述了典型的几种你可以用来加速游戏的技术。它假设你已经非常肯定使用C 的好处,并且你也对优化的基本概念相当熟悉。

第一个经常让人获益的基本概念显然是剖析(profiling)的重要性。缺乏剖析的话,程序员将犯两种错误,其一是优化了错误的代码:如果一个程序的主要指标不是效率,那么一切花在使其更高效上的时间都是浪费。靠直觉来判断哪段代码的主要指标是效率是不可信的,只有直接去测量。第二个概念是程序员经常“优化”到降低了代码的速度。这在C 是一个典型问题,一个简单的指令行可能会产生巨大数量的机器代码,你应当经常检查你的编译器的输出,并且剖析之。

1、对象的构造与析构

对象的构造与析构是C 的核心概念之一,也是编译器背着你产生代码的一个主要地方。未经认真设计的程序经常花费不少时间在调用构造函数,拷贝对象以及初始化临时对象等等。幸运的是,一般的感觉和几条简单的规则可以让沉重的对象代码跑得和C只有毫厘之差。 除非需要否则不构造。最快的代码是根本不运行的代码。为什么要创建一个你根本不去使用的对象呢?在后面的代码中:

   voide Function(int arg) 

   { 

     Object boj. 

     If(arg==0) 

       Return. 

     ... 

   }

即便arg为0,我们也付出了调用Object的构造函数的代价。特别是如果arg经常是0,并且Object本身还分配内存,这种浪费会更加严重。显然的,解决方案就是把obj的定义移到判断之后。

小心在循环中定义复杂变量,如果在循环中按照除非需要否则不构造的原则构造了复杂的对象,那么你在每一次循环的时候都要付出一次构造的代价。最好在循环外构造之以只构造一次。如果一个函数在内循环中被调用,而该函数在栈内构造了一个对象,你可以在外部构造并传递一个应用给它。

1.1 采用初始化列表

考虑下面的类:

   class Vehicle 

   { 

   public 

     Vehicle(const std::string &.name) 

     { 

       mName=name 

     } 

   private: 

     std::string mName. 

   }

因为成员变量会在构造函数本体执行前构造,这段代码调用了string mName的构造函数,然后调用了一个=操作符,来拷贝其值。这个例子中的一个典型的不好之处在于string的缺省构造函数会分配内存,但实际上都会分配大大超过实际需要的空间。接下来的代码会好些,并且阻止了对=操作符的调用,进一步的来说,因为给出了更多的信息,非缺省构造函数会更有效,并且编译器可以在构造函数函数体为空的情况下将其优化掉。

   class Vehicle 

   { 

   public 

     Vehicle(const std::string &.name):mName(name) 

     { } 

   private: 

     std::string mName. 

   }


相关文章


Linux系统编程之C 游戏程序优化(2)
Linux操作系统内核对RTC的编程详解(5)
Linux系统编程之C 游戏程序优化(1)
Linux操作系统内核对RTC的编程详解(4)
Linux操作系统内核对RTC的编程详解(3)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛