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

这样一个排列。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值