首页 > 代码库 > 游戏引擎与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相互引用时的死锁问题

作者Focustc,来自于CSDN

游戏引擎与C++