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

Posted

技术标签:

【中文标题】游戏编程 - 如何避免重新发明***【英文标题】:Game programming - How to avoid reinventing the wheel 【发布时间】:2010-09-19 02:34:38 【问题描述】:

总结:

我可以编写一个“厚 C语言中的客户端”游戏,无需重新发明 ***,或者我应该只咬 子弹并使用一些库或SDK? 我是一个中等的 C 程序员,但不是 害怕使用指针、数据 结构、内存位置等,如果 它会给我我需要的控制权 做一个伟大的“厚客户端”游戏。 但是,我正在考虑避开 高级语言和框架 为了权力和控制,不是 易于使用。

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

我目前的想法是:

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

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

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

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

【讨论】:

我们可以只使用 C 而不使用其他库来制作图形游戏吗?【参考方案3】:

我建议你试试pyglet。

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

在性能方面,对于大多数 2D 和 3D 游戏任务,尤其是构建类似格斗游戏的东西,该平台运行良好。它不像您在进行裸机 DirectX 编程那样那么快,但它可以让您非常接近,并且在托管环境中也一样。

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

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

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

【参考方案8】:

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

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

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

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

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

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

【讨论】:

【参考方案9】:

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

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

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

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

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

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

【讨论】:

【参考方案10】:

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

我在my games中使用了这种方法;将chipmunk 用于 2D 物理,将 Lua 作为嵌入式脚本语言,并使用 Apple 的 openGL ES 实现。我用 C 语言编写了胶水将所有这些联系在一起。最终产品是定义游戏对象、创建它们的实例以及在它们在暴露给 Lua 的 C 函数中相互交互时处理事件的能力。这种方法在many high performance games 中使用非常成功。

【讨论】:

【参考方案11】:

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

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

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

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

【讨论】:

【参考方案12】:

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

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

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

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

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

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

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

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

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

【讨论】:

以上是关于游戏编程 - 如何避免重新发明***的主要内容,如果未能解决你的问题,请参考以下文章

结对编程——黄金点游戏

OpenGL核心技术之GPU编程

游戏编程模式-脏标记模式

游戏编程入门

如何制作小游戏

Solitaire 纸牌游戏 - 如何编程恢复游戏功能?