game c++

来源:互联网 发布:怎么样弄中文域名 编辑:程序博客网 时间:2024/06/08 07:02

game c++

一般而言,比起C程序来说,C++游戏程序是可重用和可维护的。可这真的有价值吗?复杂的C++可以在速度上与传统的C程序相提并论吗?
  如果有一个好的编译器,再加上对语言的了解,真的有可能用C++写出一些有效率的游戏程序来。本文描述了典型的几种你可以用来加速游戏的技术。它假设你已经非常肯定使用C++的好处,并且你也对优化的基本概念相当熟悉。
  第一个经常让人获益的基本概念显然是剖析(profiling)的重要性。缺乏剖析的话,程序员将犯两种错误,其一是优化了错误的代码:如果一个程序的主要指标不是效率,那么一切花在使其更高效上的时间都是浪费。靠直觉来判断哪段代码的主要指标是效率是不可信的,只有直接去测量。第二个概念是程序员经常 "优化"到降低了代码的速度。这在C++是一个典型问题,一个简单的指令行可能会产生巨大数量的机器代码,你应当经常检查你的编译器的输出,并且剖析之。
1
、对象的构造与析构
  对象的构造与析构是C++的核心概念之一,也是编译器背着你产生代码的一个主要地方。未经认真设计的程序经常花费不少时间在调用构造函数,拷贝对象以及初始化临时对象等等。幸运的是,一般的感觉和几条简单的规则可以让沉重的对象代码跑得和C只有毫厘之差。
  除非需要否则不构造。
  最快的代码是根本不运行的代码。为什么要创建一个你根本不去使用的对象呢?在后面的代码中:

  voide Function(int arg)
  
{
    
Object boj;
    
If(arg==0)
      
Return;
    
...
  
}

  即便arg0,我们也付出了调用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;
  
}

  1.2 要前自增不要后自增(即要++I不要I++

  当写x=y++时产生的问题是自增功能将需要制造一个保持y的原值的拷贝,然后y自增,并把原始的值返回。后自增包括了一个临时对象的构造,而前自增则不要。对于整数,这没有额外的负担,但对于用户自定义类型,这就是浪费,你应该在有可能的情况下运用前自增,在循环变量中,你会常遇到这种情形。
  不使用有返回值的操作符 C++中经常看到这样写顶点的加法:

  Vector operator+(const Vector &v1,const Vector &v2)

  这个操作将引起返回一个新的Vector对象,它还必须被以值的形式返回。虽然这样可以写v=v1+v2这样的表达式,但象构造临时对象和对象的拷贝这样的负担,对于象顶点加法这样常被调用的事情来说太大了一点。有时候是可以好好规划代码以使编译器可以把临时对象优化掉(这一点就是所谓的返回值优化)。但是更普遍的情形下,你最好放下架子,写一点难看但更快速的代码:


  void Vector::Add(const Vector &v1,const Vector &v2)

  注意+=操作符并没有同样的问题,它只是修改第一个参数,并不需要返回一个临时对象,所以,可能的情况下,你也可以用+=代替+


  1.3 使用轻量级的构造函数
  在上一个例子中Vector的构造函数是否需要初始化它的元素为0?这个问题可能在你的代码中会有好几处出现。如果是的话,它使得无论是否必要,所有的调用都要付初始化的代价。典型的来说,临时顶点以及成员变量就会要无辜的承受这些额外的开销。

  • 298C Parity Game
  • C - Easy Game
  • codeforces 214C Game
  • 【CODEFORCES】 C. 24 Game
  • C. The Tag Game
  • C. Karen and Game
  • codeforces C. Beaver Game 博弈
  • C - A Coloring Game 博弈
  • C - I Love This Game
  • CF 268C 24 Game
  • 482 C. Game with Strings
  • CodeForces 469C - 24 Game
  • 【UVALive】3029.City Game<C++>
  • hdu5725 Game 2016年多校C
  • CF 277C Game(博弈)
  • C. Table Tennis Game 2
  • 292. Nim Game (C++)
  • C. Table Tennis Game 2
  • SQL Server常用函数
  • Discuz! 7.0.0 Rewrite 配置说明
  • session Asii码转换
  • 存储学习之路
  • 树言树语:等待呼喊中的面试消息
  • game c++
  • 表单中文本框和密码框对齐
  • SUSE VNC copy&paste
  • 碰撞检测
  • Mysql存储过程(四)——异常处理
  • 2010~ ubuntu的源码搭建lamp
  • remove_if 算法缺陷
  • 主机系统与虚拟Linux系统通信问题
  • HttpFileCollection 多文件上传的实现以及需要注意的事项
  • 原创粉丝点击