现代C ++游戏编程实例

时间:2009-05-07 03:44:04

标签: c++

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

  1. polymorphism,
  2. STL,
  3. 异常安全/处理,
  4. 基于策略的类设计的模板,
  5. 智能指针
  6. new / delete,placement new / delete
  7. 用于游戏工作室?我很想知道库的名称和它们使用的C ++特性。例如,Orge3D使用所有现代C ++功能,包括异常和智能指针。换句话说,如果我要使用现代C ++寻找游戏库的示例,我会去Orge3D。但我不知道这些功能是否会阻止游戏工作室使用Orge3D。

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

    理想情况下,如果C ++功能最适合所有情况,那么最常使用这些功能。但似乎没有。阻抗是什么?显而易见的是必须阅读一摞书,但这只是半个原因。这个问题是对“C++ for Game Programming - Love or Distrust?”的跟进(从回复中我得到的印象是许多C ++功能仍未在游戏中使用;这不一定是应该的方式)。

4 个答案:

答案 0 :(得分:26)

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

  • 多态性

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

  • STL,

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

  • 异常安全/处理,

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

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

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

  • 智能指针

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

  • new / delete,placement new / delete

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

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

答案 1 :(得分:10)

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

答案 2 :(得分:7)

  1. 大量
  2. 方式很多。但我们试图在运行时将自己限制为std :: vector。
  3. 无所不知。
  4. 什么?
  5. 我们的代码已经被这种疾病感染了。然而,我们将开始鞭打人们传播祸害。
  6. 是。手。

答案 3 :(得分:-1)

尽管如此,你提到的6分中有5分是标准的C ++术语。那不是"游戏编程"它天真地使用了流行语。我的建议是这样的;学习你的数学......尤其是三角形。然后获取一些数据表并了解现代图形硬件平台...而不是敏感的C#bullony words..learn汇编程序编程。

在一天结束时,要成为一名游戏程序员,你必须能够做数学。那是