专业游戏开发环境中的最佳C ++编程实践?

时间:2010-07-16 15:43:20

标签: c++ stl

我在C ++编程语言方面受过良好的语法,STL等方面的教育。除了一些大学课程,我还没有做过任何真正的项目。我的目标是开始编写程序,但尝试将其保持在行业最佳实践中。我的主要目标之一是在游戏行业工作。门正在打开,引导我提出这些问题。

  1. C ++游戏开发人员通常是否仅限于使用所有C ++功能?每个平台都或多或少都是真的吗?
  2. 这些天是在环境中使用STL,还是应该避免使用?
  3. 他们是否将C ++视为“一切都必须是一个对象”,还是一种范式组合?
  4. 他们倾向于不使用的任何功能?
  5. C是否仍然使用,并且显示完成的项目是否合适?
  6. 我确实和一位着名的游戏设计师谈过,他说他们不使用STL并且说使用基本的封装类,但他说不要使用所有其他高级C ++功能。我们的想法是保持简单。这很常见吗?
  7. 提前致谢!

8 个答案:

答案 0 :(得分:5)

请记住,“游戏开发”涵盖从手机到网站到PSP和DS到Wii,Xbox,PS3和PC / Mac的所有内容,因此您获得的答案可能因产品/开发人员/平台而异。 / p>

1)是的。游戏开发可能意味着您必须为目标平台使用特定的编译器,这可能不支持C ++的某些“较新”功能。您可能会受限于开发工作室允许您使用的库。此外,某些平台上的硬件限制可能会影响您的编码方式(例如,在某些系统上,与PC相比,虚拟功能的成本可能会过高,因此出于性能原因,您的设计可能会受到纯OO的限制。某些系统受限资源(内存,磁盘等)会对您的设计产生很大影响。在Playstation3上,您可能需要编写矢量处理SPU任务而不是传统的单/多线程代码等。

2)是的。 (它是常用的,因为通常没有时间浪费时间滚动你自己,可能效率较低的等价物)

3)混合。通常在游戏中,关键目标是(按照粗略的顺序):按时交付不可能的(你为什么现在回家,只有晚上10点?),提供高性能,并尽量不崩溃。

4,6)通常保持代码简单灵活,以便您可以快速开发并根据制作人的最新愿景进行更改。您通常有紧迫的期限,因此很多设计和仔细编码往往难以实现。不幸的是,业界倾向于“快速生成代码,以便我们可以将其丢弃并开始使用下一个产品”,尽管它正在慢慢地实现可重用库的想法(以及更有条理的专业实践,如单元测试等)。

一个典型的场景是要求为老板编写一个快速而又脏的演示,然后当你认为你能够把它扔掉并正确地写出来时,老板说“我们没有时间重写已经有效的东西,从下一个层面开始“。因此,如果你被要求快速行动,尽量不要烧太多桥梁,否则你会后悔。

5)您可以使用C,但这取决于平台和开发公司。如今,大多数开发都将是C ++,即使代码的某些部分在语法和功能方面实际上“仅仅是C”。

答案 1 :(得分:2)

这些问题并非游戏开发所独有。你会发现他们的场地和公司的差异很大。我可以想到两个使用STL的游戏设计公司,以及一些不使用STL的游戏设计公司。

1)定义“所有C ++功能”。他们通常不使用goto,如果这就是你的意思。

2)是的,使用STL。你不应该避免它,或者不要避免它 - 每次你有一份需要完成的工作时,使用你需要的工具来完成工作。保持您使用的与其他方式一致的类似问题得到解决 - 在该项目或背景下 - 是重要的。

3)取决于你在游戏和游戏中的位置。有些是毕业的C家伙,他们想要更喜欢C的东西。其他人是更多OO(Object Obsessed)的C#/ Java人。

4)转到

5)是的,是的。了解多种语言总是一件好事。即使它只是C到C ++。

6)再次,使用可用的工具来解决您的问题。当你可以的时候保持简单是好的。

答案 2 :(得分:2)

1)没有限制,除非您应该遵循编程指南以便正确使用它们(即在使用goto时避免dinosaurs)。

2)是的,它的使用,Boost也是(这是下一个STL的预览)。

3)混合,总是混合。要说C ++仅 面向对象就是误解了语言。 “一切都是对象”真的是一种Java(或类似的东西)的东西;查看C ++的POD概念,作为一切不是一个对象的例子。

4)与1)相同

5)它已被使用,但就我所见,在C中没有创建新项目。

6)不......他说的与我刚刚说的相反。

答案 3 :(得分:1)

通常,由于模式和性能原因,C ++的某些部分受到限制。

通常禁用例外和RTTI。当它们展开堆栈时,例外是昂贵的,并且RTTI使用太多内存。缺少异常尤其令人痛苦,因为程序员倾向于只返回NULL,而不是提出另一个错误处理系统。 :)

出于性能原因,浮游物几乎全部用于双打。

可以使用虚函数和继承,但虚拟表查找可能成本很高,因此有时会进行优化。

可以使用STL,但通常必须编写自己的分配器以避免内存碎片(请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html)。更常见的是看到不同质量的定制容器。我从来没有遇到过在控制台项目中使用的提升。

大多数代码都是OO,几乎是故障。

答案 4 :(得分:1)

  

专业游戏开发环境中的最佳C ++编程实践?

问题太宽泛了。

  

C ++游戏开发人员通常是否仅限于使用所有C ++功能?每个平台或多或少都是真的吗?

不,或者至少极不可能。取决于平台/编译器。

  

这些天是在环境中使用STL,还是应该避免使用?

你不应该避免它,但是:

  1. 如果你想要stl容器,你肯定需要一个分析器
  2. STL容器在调试版本中非常慢。这可能是一个问题,因为如果您经常访问它们,调试版本中将会出现巨大的性能下降(例如,从300 fps到50)(与发布版本相比)。调试代码已经慢了,并且stl容器在调试版本中有大量的“安全检查”。
  3.   

    他们是否将C ++视为“一切都必须是对象”

    如果你把它带到极端,每个想法都是不好的。 “一切都必须是一个对象”就是其中之一。

      

    他们倾向于不使用的任何功能?

    为什么呢?除非存在编译器错误或性能损失,否则避免使用功能是没有意义的。此外,还有用java编写的商业3D游戏,所以我认为避免编译语言的功能没有意义。

      

    C是否仍然使用,并且显示完成的项目是否合适?

    有些开源项目可能会使用C,但我不记得完全写在其中的游戏。有Q3引擎,但是它是C / C ++的混合。

      

    我确实与一位着名的游戏设计师谈过,他说他们不使用STL并且说使用基本的封装类,但他说不要使用所有其他高级C ++功能。

    他们可以决定避免使用stl,因为容器在调试版本中很慢。目前还不清楚你究竟称之为“高级C ++功能”。另外,请记住他是设计师,而不是程序员

      

    这个想法是保持简单。这是常见的吗?

    这个想法可能会也可能不常见,但对于小型团队来说这是一个正确的想法。由于人力资源有限,一切都应尽可能简单 - 降低开发成本。如果你坚持像“一切都应该是一个对象”的概念,决定建立“漂亮的”阶级等级,如果你的资源有限,那么你注定要失败 - 你很可能永远不会完成你的项目,并将永远重写代码,并试图决定从什么应该得到什么。不必要的项目灵活性和可扩展性可能会扼杀小项目。游戏引擎不一定非常复杂。

    大型团队可能会提供复杂的解决方案,但复杂性会导致额外的错误。例如,你可以看看sims 3 - 它有一个非常先进的系统(对象“插件”,游戏资源管理,GPU资源管理,内容“流”等),我认为他们甚至把游戏逻辑放到几个.NET中存储在游戏存档中的模块...),但系统的可扩展性在某些更新后导致了大量的错误。

答案 5 :(得分:1)

电子艺术作为一个例子使用STL,但感到被迫创建自己的版本称为EASTL

答案 6 :(得分:0)

  1. C ++游戏开发人员通常是否仅限于使用所有C ++功能?每个平台或多或少都是真的吗? 这些天,我觉得它在主控制台平台上相当不错,但如果你是为移动设备开发,我怀疑它甚至是如此
  2. 这些天是在环境中使用STL,还是应该避免使用? 它被使用并且应该被使用...但有些人不相信它,因为过去STL支持更不均匀,有时会出现性能问题
  3. 他们是否将C ++视为“一切都必须是一个对象”,还是一种范式组合? 太一般了。因人而异,公司不同。平均而言,游戏开发人员以不太专注于软件工程而更多地关注黑客代码而闻名,但这太过于普遍而无法真正使用。然而,在采访中宣传设计模式和框架以及抽象的30分钟可能不是一个很好的计划
  4. 他们倾向于不使用的任何功能? STL在那些在旧平台上工作的人中仍然表现不佳。也有例外和RTTI,可能是sicne他们得不到很好的支持(可能还没有)
  5. C是否仍然使用,并且显示完成的项目是否合适? 我确定它是,如果你有一个项目然后显示它,但它并没有像C ++那样广泛使用
  6. 我确实与一位着名的游戏设计师谈过,他说他们不使用STL并且说使用基本的封装类,但他说不要使用所有其他高级C ++功能。我们的想法是保持简单。这是常见的吗? 这种观点很常见,但并不意味着它是对的。你可能需要谨慎行事,以避免让一位没有时代感动的20年老将感到不安

答案 7 :(得分:0)

我打算假设你指的是那些为游戏机和PC开发全价游戏的人。

“C ++游戏开发人员通常是否仅限于使用所有C ++功能?”

我认为大多数都是避免异常,RTTI,并且很多都避免使用标准库的STL部分。他们可能正在使用模板,但没有太多的元编程。我不认为这在整个平台上变化很大。但它确实因公司而异。

“这些天是在环境中使用STL,还是应该避免使用?”

它被很多人使用,但不是全部。不要忽视它 - 它是一个非常有用的工具,非常擅长它的设计任务。只要确保没有它就可以过关。

“他们是否将C ++视为”一切都必须是对象“,还是混合范式?”

不同的地方将以不同的方式运作。 C ++中的面向对象没有任何内在因素对游戏开发有利或不利。请记住,通常有遗留代码或第三方库是用C语言编写的,或者是用C语言编写的,所以你很少有C ++。

“他们倾向于不使用的任何功能?”

我认为我们已经涵盖了上述内容。

“C是否仍在使用,是否很好地展示完成的项目?”

是的,不。在你第一份工作之前,生活太短暂,无法掌握每一种相关的语言和方言。显示使用C风格库(例如SDL)的能力应该足够了。显然,如果你设定加入一家只使用C的公司的目标,你将不得不考虑这一点。

“我确实与一位着名的游戏设计师交谈,他说他们不使用STL,并说要使用基本的封装类,但他说不要使用所有其他高级C ++功能。这个想法是保持这很简单。这很常见吗?“

见上文。顺便说一下,游戏“设计师”通常不是程序员,所以请注意你的术语。如果您申请游戏设计师角色,通常不会展示编程技能。