现代C++游戏编程实例

ami*_*mit 9 c++

现代C++的功能在多大程度上如下:

  1. 多态性,
  2. STL,
  3. 异常安全/处理,
  4. 基于策略的类设计的模板,
  5. 智能指针
  6. new/delete,placement new/delete

用于游戏工作室?我很想知道库的名称和它们使用的C++特性.例如,Orge3D使用所有现代C++功能,包括异常和智能指针.换句话说,如果我要使用现代C++寻找游戏库的示例,我会去Orge3D.但我不知道这些功能是否会阻止游戏工作室使用Orge3D.

此外,我不知道是否还有其他例子.例如,我在一段时间之前使用过Box2D,但它只使用了placement new和class关键字作为C++特性.由于所有成员都是公开的,因此即使封装也在这些类中被打破.

理想情况下,如果C++功能最适合所有情况,那么最常使用这些功能.但似乎没有.阻抗是什么?显而易见的是必须阅读一摞书,但这只是半个原因.这个问题是对" 游戏编程的C++ - 爱还是不信任? " 的后续跟进(从回答中我得到的印象是许多C++特性仍未在游戏中使用;这不一定是应该的方式).

Dan*_*son 26

我曾在2家游戏公司工作过,看过很多代码库,并在游戏开发者中观察过一些关于这些问题的争论,所以我或许可以提供一些观察.每个要点的简短答案是,它在不同的工作室之间,甚至在同一个工作室内的团队之间变化很大.下面列举的长答案:

  • 多态性,

一些工作室使用但不是其他工作室.许多团队仍然宁愿避免它.虚拟功能调用确实需要付出代价,即使在现代游戏机上,这种成本也很明显.在那些使用多态性的人中,我的愤世嫉俗的假设是,只有一小部分人使用它.

  • STL,

由于与多态性相同的许多原因,在中间分开.STL很容易错误使用,因此许多工作室选择在这些基础上避免它.在那些大量使用它的人中,许多人将它与自定义分配器配对.EA创建了EASTL,它解决了游戏开发中STL的许多问题.

  • 异常安全/处理,

很少有工作室使用异常处理.现代控制台的首要建议之一是关闭RTTI和异常.PC游戏可能会使用异常来获得更大的效果,但在控制台工作室中,异常情况经常被避开.它们增加了代码大小,这可能是非常宝贵的,并且在某些相关平台上并不支持.

  • 基于策略的类设计的模板,

基于政策的设计......我没有遇到任何问题.模板经常用于内省/反射和代码重用等事情.当我阅读Alexandrescu的书时,基于政策的设计对我来说似乎是一个有缺陷的承诺.我怀疑它在游戏行业中的使用非常多,但是从一个工作室到另一个工作室它会有很大差异.

  • 智能指针

许多工作室也使用智能指针,这些工作室也使用多态和STL.控制台游戏中的内存管理非常重要,因此很多人不喜欢引用计数智能指针,因为他们没有明确他们何时自由...但这些肯定不是唯一的智能指针.一般来说智能指针的想法仍在增加.我认为这将在2 - 3年内更加普遍.

  • new/delete,placement new/delete

这些经常使用.它们经常被覆盖以使用下面的自定义分配器,因此可以轻松跟踪内存并找到泄漏.

我想我同意你的结论.游戏工作室中没有尽可能多地使用C++.这有很好的和不好的理由.好的是因为性能影响或记忆问题,坏的是因为人们陷入了困境.在很多方面,按照他们一直以来的方式做事是有意义的,如果这意味着有限C++的C,那么它意味着C有限的C++.但是有许多反C++偏见浮出水面......有些是合理的,有些则没有.


小智 11

  1. 相当广泛,尽管人们都注意到虚函数调用的开销
  2. 这取决于.一些开发人员完全发誓,其他开发人员限制使用容器,如矢量,具有良好的缓存一致性和运行时性能,并且不会不断分配.我认为一般的观察结果是,面向控制台的工作室越多,他们使用的STL就越少.PC开发人员可以逃脱它,因为他们可以回退到虚拟内存系统,并且有足够的CPU.控制台人员关心每一个分配,如果你正在做一个多平台标题,你会进入不同平台的STL实现的奇妙世界,表现不同并且有不同的错误,尽管近年来这种情况肯定有所改善.游戏开发者也喜欢管理他们自己的堆和分配,这可能很难与STL打交道.
  3. 期望在编译器设置中禁用它
  4. 哈哈,好的.
  5. 我不确定.我还没有真正看到游戏代码中的智能指针使用,虽然除了对动态内存的普遍厌恶之外,我认为从游戏开发的角度来看,智能指针并没有什么特别令人讨厌的东西.
  6. 这又取决于.PC家伙可能会分配和解除分配,就像他们根本不在乎.控制台人员关心每一个分配.这并不意味着没有新的和删除,但它可能意味着动态分配仅在游戏或当前级别设置时执行一次,然后一直保持到游戏或当前级别被拆除为止.最好避免每帧分配和解除分配,不仅要保持总内存使用率下降,还要避免碎片.您将在控制台游戏引擎中看到许多固定大小的数组和静态分配的结构.


JJa*_*son 7

  1. 地段
  2. 方式很多.但是我们试图在运行时将自己限制为std :: vector.
  3. 没有任何.
  4. 什么?
  5. 我们的代码已经被这种疾病感染了.然而,我们将开始鞭打人们传播祸害.
  6. 是.许多.

  • 我不知道为什么这个答案被拒绝了.它看起来像一个诚实的答案(如果你愿意,可能不是一个"正确的"),我会投票. (2认同)