游戏引擎与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相互引用时的死锁问题
作者Focustc,来自于CSDN
时间: 2024-10-01 00:23:19