11

概括:

我可以在不重新发明轮子的情况下用 C 编写“厚客户端”游戏,还是应该硬着头皮使用一些库或 SDK?我是一个中等的 C 程序员,并且不害怕使用指针、数据结构、内存位置等。如果它能给我制作一个伟大的“厚客户端”游戏所需的控制权。但是,我正在考虑为了权力和控制而不是 易用性而避开高级语言和框架。

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

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

我问这个问题是因为我知道我很容易患上这里没有发明综合症。我一直想自己编程,我敢肯定这会浪费很多时间。然而,这对我来说非常有效——例如,我没有使用Rails(一个非常大的 Web 项目框架,其中包含一个 ORM 和 GUI 工具包),而是使用了一系列较小的 Ruby 工具,如racksequel组合在一起漂亮。

所以,我转向你,SO专家。我是不是太天真了?这是我的看法:

  • 使用 C
    • 缺点
      • 可能会让我讨厌编程
      • 重新发明轮子的高风险
      • 需要很长时间以至于我失去兴趣的高风险
    • 优点
      • 久经考验 - 大多数 A-list 游戏都是用 C 语言完成的(今天仍然如此吗?)
      • 对内存管理、速度、资产管理等的高度控制,我相信自己会学会处理这些
      • 没有杂物
  • 使用框架或 SDK
    • 缺点
      • 交付物过大的风险
      • 在游戏开发的各个方面都依赖于原始库作者——如果没有我想要的功能怎么办?我必须自己编程,这还不错,但首先部分违背了使用高级框架的目的
      • 性能问题的高风险
    • 优点
      • 更快的开发时间
      • 可能更容易维护
      • 没有浪费时间重新发明通用范式

我还能在这个列表中添加什么?这是一个纯粹的判断电话,还是有人可以为我达成交易?欢迎提出书籍建议。

4

14 回答 14

13

我相信你在一个谬误下工作。

有几个专门用于游戏编程的框架——由对游戏设计复杂性有丰富经验的人编写,几乎可以肯定比你做的更多。

换句话说,如果您不使用框架,您将面临“性能问题的高风险”。

于 2008-10-24T20:53:11.337 回答
8

我目前的想法是:

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

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

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

我学到的最后一点智慧是不要担心这里没有发明综合症。我开始意识到其他库(例如 STL、Boost、DirectX 等)的开发时间要多一个数量级(或三个),远远超过我在这部分上花费的时间游戏/引擎。因此,您自己实现这些东西的唯一原因是您是否想了解它们。

于 2008-12-19T15:13:18.200 回答
7

我建议您尝试pyglet

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

做一些测试,看看你是否可以让它足够快。只有当你向自己证明它没有下降到更低的水平时。虽然,我相当有信心 python + pyglet 可以处理它......在最坏的情况下你必须编写一些 C 扩展。

于 2008-10-24T21:45:29.000 回答
4

今天,我相信您可以放心地忽略性能问题,除非您专门尝试做一些突破极限的事情。例如,如果您的游戏不比 Quake II 复杂,那么您应该选择能让您在时间上发挥最大作用的工具和

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

于 2008-10-24T20:47:32.907 回答
4

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

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

于 2008-10-24T21:07:27.500 回答
4

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

性能方面,对于大多数 2D 和 3D 游戏任务,尤其是构建类似格斗游戏的东西,这个平台运行得非常好。它不像你在做裸机 DirectX 编程那样快,但它让你非常接近,并且在托管环境中,同样如此。

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

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

于 2009-01-11T00:22:49.103 回答
2

您希望能够在控制台上玩游戏吗?你想把它作为一种学习体验吗?您希望最终产品是跨平台的吗?到目前为止,您查看过哪些图书馆?

对于 2d 游戏,我认为性能不会成为问题,我建议使用可以在最短的时间内让你在屏幕上显示结果的东西。如果你有很多使用 Python 的经验,那么 pyGame 是一个不错的选择。

如果你打算将来做一些 3d 游戏,我建议你看看 Ogre ( http://www.ogre3d.org )。它是一个跨平台的 3d 图形引擎,可以抽象出图形 API。然而,对于 2d 项目,它可能是矫枉过正。

于 2008-10-24T20:41:25.197 回答
2

当今顶级游戏最常见的实现语言是 C++,并且很多游戏都嵌入了用于游戏事件脚本的脚本语言(例如 Python 或 Lua)。

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

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

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

如果你想学习底层技术(DirectX,或者你想编写优化的 blitter 出于某种不正当的原因),那么一定要使用 C++。

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

于 2008-10-24T20:44:12.213 回答
2

至于人们对 C/C++/Python 的评价,我是一名游戏开发者,我的公司鼓励 C。不是 b/c C++ 不好,而是因为写得不好的 C++ 是游戏开发的毒药,因为它很难阅读/与 C 相比,调试。(正确使用 C++ 会带来好处,但如果让初级人员使用它会犯一些错误,您的时间会浪费很多)

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

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

通常,lib 可以满足您的需求并且很棒,但有时的特定用例被 lib 处理得非常糟糕,您将从编写自己的代码中获得很大的好处。与 PC 相比,尤其是在游戏机上

(编辑:)关于脚本和垃圾收集:它在控制台上杀死你,在最近的一个游戏中,我不得不在虚幻引擎上重写垃圾收集的主要部分,以满足我们在编辑器部分的需求。在实际游戏中必须完成更多工作(不仅仅是我)(公平地说,尽管我们正在超越虚幻的原始规格)

脚本通常很好,但它不是“我赢”按钮。一般来说,如果您突破平台的限制,收益就会消失。在决定脚本的合适程度时,我会使用“我必须保留的平台 CPU 百分比”作为我的评估函数

于 2008-10-24T21:16:23.643 回答
2

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

我在我的游戏中使用这种方法;使用花栗鼠进行 2D 物理,Lua 作为嵌入式脚本语言,以及 Apple 的 openGL ES 实现。我用 C 语言编写了胶水将所有这些联系在一起。最终产品是定义游戏对象、创建它们的实例以及在它们在暴露给 Lua 的 C 函数中相互交互时处理事件的能力。这种方法在许多高性能游戏中得到了很大的成功。

于 2008-12-19T16:15:48.370 回答
1

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

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

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

我想说,问问自己你还想要什么:从头到尾编写游戏并学习游戏开发,或者学习一门新语言(C++)。如果您想编写游戏,请使用脚本语言。如果您想学习一门新语言,请使用 C++。

于 2008-10-24T21:00:37.513 回答
1

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

我个人喜欢推荐GarageGames的 Torque Game Builder(又名 Torque 2D) 。但是您可能也可以找到一些满足您需求的免费游戏引擎。

于 2008-10-24T21:09:09.370 回答
0

我很确定大多数现代游戏都是用 C++ 完成的,而不是 C。(我采访过的每家游戏公司都问过 C++ 问题。)
为什么不使用 C++ 和现有的库来处理物理 + 碰撞、声音、图形引擎等。你仍然写游戏,但世俗的东西得到了照顾。

于 2008-10-24T20:50:02.230 回答
0

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

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

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

即使使用像 XNA 这样的框架,如果大多数视频游戏开发概念对您来说都是陌生的,那么仍然有很多东西需要学习和学习。XNA 将允许您巧妙地避开万向节锁定,但对于那些不了解基本着色概念的人来说,可悲了。另一方面,像 DarkBASIC 之类的东西不会解决您的万向节锁定问题,但阴影主要是为您处理的。

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

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

于 2009-12-16T20:47:50.700 回答