使用OpenGL从头开始编写游戏引擎[关闭]


15

我想从头开始编写我的游戏引擎,以供学习之用,先决条件是什么,该怎么做?您向我推荐什么编程语言和东西?另外,如果您有不错的文章和书籍,那也将很棒。提前致谢!

我的编程语言和工具是:

  • C / C ++仅使用C会好吗?
  • 蟒蛇
  • 的OpenGL
  • 吉特
  • 广东发展银行

我想从中学到什么:

  • 核心游戏引擎
  • 渲染/图形
  • 游戏玩法/规则
  • 输入(键盘/鼠标/控制器等)

在渲染/图形中:

  • 3D
  • 底纹
  • 灯光
  • 纹理化

有两点:这个问题本身太笼统了。您想要什么功能,您想支持什么平台,您想探索什么范例,您想在脚本语言(如果有)中承担多少责任,以及我要处理的其他很多事情?我不会打扰继续上市。
四分

8
第二:有一个普遍的普遍智慧,那就是其他人会吐口水,说你不应该专注于没有游戏的引擎。没有游戏的引擎意味着您无法证明自己的引擎有用。好的引擎需要人们像以前那样吃自己的狗粮。常用-链接到博客进入更多的这种说法是在这里:scientificninja.com/blog/write-games-not-engines
四分

2
^不仅如此,在没有游戏的情况下编写引擎来激发功能需求也会导致功能蠕变和错误的API设计。除非您知道所需的内容(游戏要求提示),否则您可能不会在引擎中放入有用的内容。同样,如果您不必使用引擎进行编程,则可能会发现您的某些决定确实很笨拙。
克里斯(ChrisE)2011年

1
我看不到您的清单中的重点。您知道C / C ++和Python可以为我们提供帮助,但是为什么列出您可以使用版本控制和调试器呢?
共产主义鸭子

2
@TheCommunistDuck:嘿,这比某些开发人员要好。:)
ChrisE 2011年

Answers:


11

您可以使用几乎任何渲染方法以几乎任何语言编写游戏引擎。例如,您可以使用控制台输出以bash编写游戏引擎。

因此,我认为最好在编写自己的引擎时定义要确切学习的知识。游戏开发中有很多“领域”。

  • 核心游戏引擎

  • 渲染/图形

  • 人工智能

  • 联网

  • 游戏玩法/规则

  • 声音

  • 输入(键盘/鼠标/控制器等)

等等。从那里甚至可以包含子主题。在渲染/图形中

  • 2d还是3d?

  • 造型

  • 底纹

  • 灯光

  • 纹理化

  • GUI / Hud /接口。

  • 等等

这些子主题中只有一个可以消耗很多小时(或数年!)的学习时间!

因此,首先定义您想学习的内容。从简单开始。

使用任何您喜欢的语言-尽管有些语言更适合某些任务。例如,核心引擎和渲染可能最好使用“较低”级别的语言(例如C / C ++)来完成(如果您需要这样的性能);但最好使用高级语言来完成诸如AI或游戏规则之类的事情。没有什么可以说你不能混搭。您可以用C ++编写引擎,用C渲染(因为它与OpenGL配合良好),然后使用LUA编写游戏规则脚本等。

就示例而言,有一个名为Slick2D的游戏引擎。它是用Java编写的,并且是开源的。这是编写和设计得非常好的简单2d引擎的示例。您可以从中学习基本概念,例如游戏循环,管理游戏状态等。

如果您对C / C ++满意;我建议您看一下SDL / OpenGL。它可以处理一些客房服务,例如输入,声音,创建窗户等,并且可以专注于其他内容。


4
啊,我学习C ++和控制台游戏的日子真有趣…… [创建了新的控制台项目...]
Nick Bedford

我更新了我的问题,希望给我很多很棒的资源:)
Wazery 2011年

4

SDL + OpenGL是启动自定义游戏引擎的绝佳选择。

我个人使用的是C-ish版本的C ++,因为我发现它最适合我。我的意思是我不使用任何例外。这样做有两个原因:第一个和最重要的例外是始终要求例外安全代码,而使用OpenGL和SDL并不是那么容易实现。但是,更重要的是,通过这种方式很容易在C ABI上公开C ++对象,如果您尝试将脚本语言引入混合语言,这将非常有用。

我和您的情况相似,如果有人感兴趣,我会在博客(immersedcode.org)中写下有关SDL和OpenGL的一些经历。

对于一般架构,我有两个建议:如果您想要3D引擎,请参阅Jason Lander的《 Game Engine Architecture》一书。如果您想要的只是2D,请保持设计尽可能简单,并让自己受到XNA或其他项目的启发。

最后:不要到处调用OpenGL。帮自己一个忙,将它隔离在几个地方,以便以后可以在桌面OpenGL / OpenGL ES甚至DirectX之间进行切换。


0

除非实现细节可以帮助您,否则不要使用C。否则,请使用C ++,因为它可以提供功能更强大的语言,并且您始终可以选择以后不使用这些功能。我个人没有针对Python的东西,我从未使用过它。

我不建议对DirectX使用OpenGL,因为DX具有现代的面向对象的方法,该方法更加简洁,更易于理解/更易于出错。相比之下,OpenGL提供的接口非常差。

我得到的最后一件事是,我从很多人那里听说,我相信GDB完全是糟透了,而Visual Studio调试器是迄今为止最好的。这不是我的亲身经历,所以要加一点盐。


4
“ OpenGL与DX”。DirectX更加面向对象这一事实并不重要。就更容易理解而言... OpenGL(3之前的版本)公开了一个相当简单的界面,该界面很容易扫描,因为它全部是C风格的命令性方法。“将投影矩阵设置为此。开始三角形。这是一个顶点。这是一个顶点。这是一个顶点。结束三角形。” 1.x系列的OpenGL API非常适合在图形编程中投入使用,并且与SDL(甚至是GLUT ... urg)结合使用时,您可以使用30至50行代码来构建应用程序。
克里斯(ChrisE)2011年

2
@ChrisE:当然。有一种叫做extern "C",它的适当用法使得编写C接口相当简单-特别是对于Python,在Boost中存在一个转换器,可以轻松地绑定到它。C ++语言功能如何?他们很棒。C ++语言功能的更多使用提高了项目的可靠性,并简化了大规模编码的工作,以实现可接受的非常小的性能折衷。比较起来,C的语言功能可悲。例如,正确使用现代C ++编译器可以保证没有内存泄漏。这样做,在C.
DeadMG

1
@DeadMG:如果OOP确实很重要,那么答案是Java或C#,而不是C ++。我不同意的是,C ++功能的使用并不能神奇地使您的代码变得更好,更快或更可靠。您必须知道如何使用这些功能,并且在设计引擎之外学习语言还真的可以很好地利用时间吗?不。不是第一次有人这样做。您可以在一两天内轻松地学习所有C语言,并且不要怀疑该语言在做什么。OpenGL,无论如何都是有用的基本调用集,提供了相同的透明度。
克里斯(ChrisE)2011年

2
在高性能游戏引擎中,OOP没什么大不了的。当然,它很有用,但通常是错误的抽象。具有良好的数据流,局部性和内存布局通常更好。尽管许多团队都在使用C ++,但他们并未使用大多数C ++功能。没有例外,尽可能少的虚拟机,没有RTTI,没有STL / Boost。为什么?可预测且快速执行,并在多个平台上提供小代码。我用C语言编写代码,我只希望在两个领域使用C ++:作用域锁和通用数组。不值得麻烦恕我直言。
无效

4
在GL vs. D3D上:GL3 / 4内核中没有矩阵堆栈,也没有attrib堆栈。GL和D3D都映射到相同的硬件体系结构,但是GL感觉很薄。确保GL状态机有点麻烦,但实际的硬件也是如此;)了解它们中的任何一个都很好,而且只要您了解实际发生的情况,就可以轻松切换到其他状态(或控制台API)。
无效
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.