game engine architecture---chap2---chap3.2


tools内容比较多,但是分值得记录的比较少,目前看来只有说ibm的purify和quantify是不错的工具,可能的话,项目里面可以使用以下。


3,fundamentals of software engineering for games


3.1 c++

重申个原则就是一般来说组合由于继承。

design pattern是好东西,但是需要好好理解,恰到好处的用----不用听没有充分理解的喷子的话。

像singleton,iterator这些,战斗力刚刚的,该用就用。


3.2 data code and memory

这部分float是个很好的复习,也对编程很有帮助,历史上也在float上犯过错误,也见到别人犯错误:

float = s*pow(2, e-127)*(1+m)

s---符号,最左边的1位

e---接下来8位

mantissa----最右边剩下的23位

float最大大约表示到3×pow(10,28),最小(绝对值)比较关键是pow(2,-126),这个也可以叫machine epsilon,是大于0的最小的positive的float值。


一些compiler specific types

有一些是compiler指定的类型,也在游戏中常常用到,实际上我个人也是更喜欢这种:

像vs compiler用的_int8, _int16这种

simd types:

会有类似_m128这样的类型。


3.2.3 c++ memory layout

这一块给力!

1st executable image

这一块在内存中的分布,会分成这么几种:

  • text(code) segment----放machine code
  • data segment----有被初始化的global variable(包括static)
  • bss segment----没被初始化的global variable放在bss segment,因为默认值是0,所以统一隔离出来作为一种优化,所以不必要的话就不要初始化global variable了,还可以省点内存
  • read only segment----const的东西(包括基本类型像const float或者class instance const blan a; )放在这里,但是const int除外,这个是直接放在code里的

2nd program stack

调用新函数的时候会做这样的事情:

  • 保留return address
  • backup register value,这样新函数也可以用这些备份过的register了

3rd packing

编译器会给成员加一些pack位来提高cache和cpu读取效率。

pack的基本原则就是class里面的member和其本身都会align到其自己大小,一些例子,做面试题挺好的:

class pad{char a};---1byte

class pad{char a; int b;}----8byte

class pad{int a; char b;}----8byte

class pad{double a; char b;} -----16byte

class pad{double a; int b; } 16byte

也就是说对类内部数据的重新排列有可能会降低内存消耗,很有用的知识点。

4th class的内存

virtual table ptr

dad class

kid class

这样一个排列。

你可能感兴趣的:(game engine architecture---chap2---chap3.2)