首页 > 代码库 > 游戏引擎与C++
游戏引擎与C++
游戏引擎与C++
- 参考CppCon 2016: Jason Jurecka “Game engine using STD C++ 11"
- 此presentation主要关注C++11在游戏引擎中的使用
游戏引擎的特点
不会使用太多STD
- 游戏的历史很久远,且对内存、cpu的使用很苛刻
- 比如对于std::string,操作比较慢,因此更多采用cstring
- 比如std中的模板会造成代码体积膨胀
游戏引擎不会使用太多异常
- 会关掉第三方库的exception
游戏引擎不会太正规的做fix,比较随意
游戏引擎中C++11的使用
- constexpr做编译期资源版本管理
- static_assert做编译期类型验证
- unique_ptr做RAII,取代auto_ptr
- auto_ptr有拷贝语义,拷贝后源对象变得无效;unique_ptr则无拷贝语义,但提供了移动语义
- auto_ptr不可作为容器元素,unique_ptr可以作为容器元素
- move语义加速了标准容器的数据拷贝
- 算法库对于raw array也适用
- ref CppCon 2016: Jason Jurecka “Game engine using STD C++ 11"
- 演讲者把自己比作一把瑞士军刀,什么都能做,但是不精通,如图形渲染、数据加载和解析、游戏AI
- std::async
- pure:用于声明纯虚函数
参考
C++11的智能指针
- 四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用
auto_ptr
- c++98中实现
- 赋值时
p1 = p2
,则p2会变成空指针,赋值其实是把p2的成员变量指针赋值给p1,并对p2调用release() - release()的作用是释放原指针,成员变量指针置为0,并返回源指针,不会释放资源
- reset()的作用是成员变量指针置为0,并释放资源
- 判断为空要使用
p.get() == NULL
- 不能放到容器中,因为容器的赋值传递会使容器中元素置位空,参考说法:
- 容器内元素的类型约束为元素类型必须支持赋值运算(引用不支持赋值,所以引用类型不能被放入容器),元素类型的对象必须可以复制(IO库类型不支持复制或赋值,所以IO类型对象不能放入容器),对于auto_ptr这种类型来说,它的赋值和复制已不是传统意义上的概念,所以放入容器中会出现很多未定义的后果。同样在作为函数入参时,除非用const & 进行修饰,否则也会出现未定义操作。
unique_ptr
- 用于取代auto_ptr,添加了move语义,并支持自定义deleter
- 相比auto_ptr,不支持赋值和复制,但支持带有move的赋值和复制,可以使用
p == NULL
判断是否为空
shared_ptr
- 用于共享资源
weak_ptr
- 用来监视shared_ptr,解决shared_ptr相互引用时的死锁问题
游戏引擎与C++
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。