游戏编程 - 如何避免重新发明轮子

时间:2008-10-24 20:30:25

标签: frameworks choice

摘要:

  

我可以编程“厚   客户“C中的游戏,没有重新发明   轮子,或者我应该咬一下   子弹并使用一些库或SDK?   我是一个温和的C程序员而不是   害怕使用指针,数据   结构,记忆位置等等   它会给我我需要的控制权   做一个伟大的“厚客户”游戏。   但是,我正在考虑避开   高级语言&框架   权力和控制的缘故,   易于使用。

我有兴趣在某个时候修改2D格斗/平台游戏作为副项目。我主要是一名Linux服务器端程序员,具有Python,Ruby和PHP方面的经验。我知道其中一些语言有很好的框架,比如PyGame。我也知道人们对Air和.NET这样的东西的成功......但我有一些担忧:

  • 性能:脚本语言非常慢。如果我正在进行实时游戏,我希望它尽可能快速。
  • 巨大的二进制文件:使用像.NET这样的框架或像Ruby这样的脚本语言通常会导致您无需的大型CLR或库。我想制作的游戏小而简单 - 我不希望它的CLR比游戏本身更大!
  • 额外的东西:老实说,我只是不喜欢继承一些大型游戏库的包袱的想法,如果我能更好地包围我自己的代码。

我问的是这个问题,因为我知道我很容易因为没有发明这种综合症。我一直想自己编程,我确信它浪费了很多时间。然而,这对我来说非常常见 - 例如,我没有使用Rails(一个非常大的Web项目框架,其中包含ORM和GUI工具包),我使用了一些较小的Ruby工具,如{{{ 3}}和rack很好地融合在一起。

所以,我转向你,SO专家。我天真吗?我就是这样看的:

  • 使用C
    • 缺点
      • 可能会让我讨厌编程
      • 重新发明车轮的高风险
      • 长期以来我失去兴趣的高风险
    • 优点
      • 试过&是的 - 大多数A-list游戏都是用C语言完成的(今天仍然如此吗?)
      • 对内存管理,速度,资产管理等的高度控制,我相信自己要学会处理
      • 没有残酷
  • 使用框架或SDK
    • 缺点
      • 超大可交付成果的风险
      • 取决于原始图书馆作者的游戏开发的各个方面 - 如果没有我想要的功能怎么办?我将不得不自己编程,这不错,但部分取消了首先使用高级框架的目的
      • 性能问题的高风险
    • 优点
      • 更快的开发时间
      • 可能更容易维护
      • 没有浪费时间重塑共同范式

我还可以在此列表中添加什么?这是一个纯粹的判断电话,还是有人可以为我封印这笔交易?欢迎预订建议。

14 个答案:

答案 0 :(得分:13)

我相信你是在谬误下工作。

有几个专门用于游戏编程的框架 - 由具有丰富游戏设计复杂性经验的人编写,几乎可以肯定你会这样做。

换句话说,如果您不使用框架,则会出现“性能问题的高风险”。

答案 1 :(得分:8)

我目前的想法是:

  • 如果您想学习编程,请从基本元素向上开始制作游戏引擎(甚至实现基本数据结构 - 列表,地图等)。我曾经做过一次,虽然这是一次学习经历,但我犯了很多错误,我不会再这样做了。然而,为了学习如何编程以及制作一些很酷的东西并看到结果,我对此评价很高。

  • 如果你想制作一个合适的游戏,可以使用你想要的任何库,并自己设计所有的游戏基础设施。这就是我现在正在做的事情,我正在使用所有的好东西,如STL,ATL / WTL,Boost,SQLite,DirectX等。到目前为止,我已经学到了很多关于中间/游戏逻辑方面的知识。代码和设计。

  • 如果您只想与艺术家和其他人合作制作成品的游戏,请使用现有的引擎之一(OGRE,Irrlicht,Nebula,Torque等)并添加您的游戏逻辑和艺术。

我所学到的最后一点智慧是,不要担心未发明的综合症。正如我已经意识到其他库(例如STL,Boost,DirectX等)在其中具有一个数量级(或三个)的开发时间,远远超过我在该部分上花费的时间。游戏/引擎因此,自己实施这些事情的唯一理由就是如果你想了解它们。

答案 2 :(得分:7)

我建议您尝试pyglet

  • 它具有良好的性能,因为它使用了opengl
  • 它是一个紧凑的一体化库
  • 除了python之外没有额外的依赖

做一些测试,看看你是否可以让它足够快。只有当你向自己证明它没有移动到较低的水平时。虽然,我相信python + pyglet可以处理它...在最坏的情况下你将不得不写几个C扩展。

答案 3 :(得分:4)

今天,我相信你处在一个可以安全地忽略性能问题的地步,除非你特意尝试做一些能够超越限制的事情。如果您的游戏比Quake II更复杂,那么您应该选择能够让您在 时间内做得最多的工具和库。

为什么选择Quake II?因为在a version compiled for .NET中运行,它在当前机器上以超过可接受的帧速率与软件渲染器一起运行。 (如果您愿意 - 比较以可接受的速率模拟多个处理器和图形硬件的MAME)

答案 4 :(得分:4)

你需要问问自己是否参与其中以构建引擎或构建游戏。如果你的目的是创造一个游戏,你一定要看一个既定的游戏引擎。对于2D游戏开发,请查看Torque Game Builder。它是一个非常强大的2D游戏引擎/ SDK,可以让您从第1天开始投入生产。它们有大量与其集成的工具,内容包,如果您想要进行更改和/或学习,您将获得完整的源代码这个怎么运作。它也兼容Mac OSX,并且在社区中有Linux版本。

如果你正在寻找控制台方面的东西,他们也有。

答案 5 :(得分:4)

我很惊讶没人提到XNA。它是围绕DirectX构建的框架,用于执行托管DirectX编程,同时消除了较低级别DirectX编程的大量漏洞和冗长。

性能方面,对于大多数2D和3D游戏任务,尤其是构建类似战斗游戏的东西,这个平台非常有效。它不像 那样快速,就好像你在进行裸机DirectX编程一样,但它会让你非常接近,并且在托管环境中也不会少。

XNA的另一个很好的好处是,大多数代码都可以在Xbox 360上运行,甚至可以通过网络连接进行调试,游戏是在Xbox上运行的。 XNA Live团队现在允许XNA游戏批准在Xbox Live Arcade上进行分发和销售。因此,如果您希望将项目带入商业状态,您可能有可用的分发方式。

与所有MS开发工具一样,文档和支持是一流的,并且有一个大型开发人员社区,其中包含大量教程,现有项目等。

答案 6 :(得分:2)

您是否希望能够在控制台上玩游戏?你想把它作为学习经历吗?您希望最终产品跨平台吗?到目前为止你研究过哪些图书馆?

对于2D游戏,我认为性能不会成为问题,我建议您选择能够在最短的时间内在屏幕上获得结果的内容。如果你有很多使用Python的经验,那么pyGame是一个不错的选择。

如果你打算将来做一些3D游戏,我建议你去看看Ogre(http://www.ogre3d.org)。它是一个跨平台的3D图形引擎,可以抽象出图形API。然而,对于一个二维项目来说,这可能是过度杀伤。

答案 7 :(得分:2)

目前A-list游戏最常见的实现语言是C ++,许多游戏都嵌入了脚本语言(如Python或Lua)用于游戏事件脚本。

您用来编写游戏的工具与编写游戏的原因以及您的要求有很大关系。这与任何其他编程项目没有什么不同。如果它是一个侧面项目,并且您自己进行,那么只有您可以评估您需要花费多少时间以及您的性能要求。

一般来说,今天的PC足够快,可以运行用脚本语言编写的2D平台。使用脚本语言可以让您更快地对事物进行原型设计,并且您将有更多时间来调整游戏玩法。同样,这与任何其他项目没有什么不同。

如果你使用C ++,你的理由不必比“因为我想要”更精细,我建议你看一下SDL的渲染和音频支持。它会让事情变得更容易一些。

如果你想学习基础技术(DirectX,或者你想为某些不正当的理由编写优化的blitters),那么一定要使用C ++。

说了这么多,我会提醒你不要过早优化。对于2D游戏,你可能最好先使用Python和PyGame。如果这些工具在现代PC上证明是不合适的,我会感到惊讶。

答案 8 :(得分:2)

关于人们对C / C ++ / Python的评价,我是一名游戏开发者而且我的公司鼓励C.不是b / c C ++很糟糕,但因为编写错误的C ++因为游戏开发很难对游戏开发造成毒害读取/调试与C相比(C ++在正确使用时会带来好处,但是让一个初级人员犯一些错误并且你的时间下沉很大)

关于实际问题: 如果您的目的只是为了让某些工作正常,请使用库。

否则,请自行编码,原因非常重要:练习
操作数据结构的实践。有时您需要管理自己的数据。练习调试实用程序代码。

libs通常会按照你想要的那样做,并且非常棒,但有时候,你的你的特定用例由lib处理得非常糟糕,你可以通过自己编写来获得很大好处。与PC相比,这尤其适用于游戏机

(编辑:)关于脚本和垃圾收集:在控制台上杀死你,在最近的游戏中我不得不重写Unreal上垃圾收集的主要部分,以满足我们的需求编辑器部分。在实际游戏中(不仅仅是我)还需要做更多的事情(尽管我们超越了Unreal的原始规格,但还是要公平)

脚本通常很好,但它不是“我赢”按钮。一般来说,如果你正在推动平台的极限,收益就会消失。在决定脚本的适用程度

时,我会使用“我必须备用的CPU百分比”作为我的评估函数

答案 9 :(得分:2)

支持C / C ++ / obj-C的一个考虑因素是,您可以针对不同的关注领域混合和匹配各种库。换句话说,您不会停留在框架中的功能实现。

我在my games中使用这种方法;使用chipmunk进行2D物理,将Lua用作嵌入式脚本语言,使用Apple的openGL ES实现。我写了胶水,用C语言将所有这些结合在一起。最终产品是能够定义游戏对象,创建它们的实例,以及在暴露给Lua的C函数中彼此交互时处理事件。这种方法在many high performance games中得到了很大的成功。

答案 10 :(得分:1)

如果您还不了解C ++,我肯定会建议您使用脚本语言。从头到尾制作一个游戏需要很大的动力,并且强迫自己同时学习一门新语言是让事情变得足够慢以至于你失去兴趣的一种好方法(尽管这是一种学习新知识的好方法)语言...)。

无论如何,大多数脚本语言都将被编译为字节代码,因此它们最大的性能影响将是垃圾收集。我没有经验足以明确描述垃圾收集的大小,但我倾向于认为在小游戏中它不应该太糟糕。

此外,如果您使用现有的脚本语言库来制作游戏,那么大多数性能关键区域(如图形)都可以用C ++编写(希望游戏库)。因此,无论如何,80%的CPU实际上可能花在C ++代码上,尽管你的大多数项目都是用Python编写的。

我会说,问问自己你想要的更多:从头到尾编写游戏,了解游戏开发,或学习一门新语言(C ++)。如果您想编写游戏,请使用脚本语言。如果您想学习一门新语言,请使用C ++。

答案 11 :(得分:1)

是的,除非你只是想了解制作游戏的所有细节,你肯定想要使用游戏引擎并专注于构建游戏逻辑而不是图形,音频,资源管理等。

我个人想从GarageGames推荐Torque Game Builder(又名Torque 2D)。但你可以找到一些适合你需求的免费游戏引擎。

答案 12 :(得分:0)

我很确定大多数现代游戏都是用C ++完成的,而不是C.(我曾经采访过的每个游戏公司都会问过C ++问题。)
为什么不使用C ++和现有的库来进行物理+碰撞,声音,图形引擎等等。你仍然在编写游戏,但是平凡的东西都会被处理掉。

答案 13 :(得分:0)

抽象问题有很多不同的解决方案,每个解决方案都以不同的方式处理。

我目前的项目使用C#,DirectX 9,HLSL和SlimDX。每个都提供了精心校准的抽象级别。 HLSL允许我实际读取我正在编写的着色器代码,SlimDX / C#允许我忽略指针,循环依赖和处理非托管代码。

也就是说,这些技术都不会对我开发人工智能,照明或物理的难易程度产生任何影响!我仍然需要以一种我不会使用更高级别框架的方式来分发我的教科书。

即使使用像XNA这样的框架,如果大多数视频游戏开发概念对你来说很陌生,那么还有很多东西需要学习。 XNA将允许你整齐地回避万向节锁定,但是那些不了解基本着色概念的人会感到沮丧。另一方面,像DarkBASIC这样的东西不会解决你的万向节锁定问题,但是阴影主要是为你处理的。

这是一个足够大的领域,你的第一个引擎永远不会是你实际使用的引擎。如果你自己写,你就不会写得好。如果您使用的是第三方库,那么肯定会让您烦恼并且您想要替换它们。

作为一个想法,它可能值得采用各种库/框架(明确地让XNA成为你的一站,即使你决定不想使用它,这是一个很好的基准)并试图构建各种原型。也许是景观(有水体)或空间物理演示。