在Go中开发游戏?[关闭]


40

Google的新Go语言仍处于起步阶段,尚未在现实​​世界中得到广泛使用或支持。即使这样,这似乎是一个有希望的实验,我想知道它是否可以在游戏开发方面有未来。我在其他地方找不到很多有关Go的游戏特定讨论,并且认为CW讨论可能是适当的。

一些想法:

  • 根据golang.org的说法,Go程序“几乎可以与类似的C或C ++代码一样快地运行” –足够快吗?
  • Go的垃圾回收器非常适合游戏吗?
  • 要在并发goroutine领域创建游戏,需要多少心理工具?
  • Go通常被称为“系统”级语言,以服务器软件为例。听到这一点,很难不想到多人游戏服务器。

你的意见?


1
我建议不熟悉GO的任何人在回答之前真正按照链接进行操作,而不是仅根据给定的“想法”做出回答,也就是说,如果您的回答是通用的并且不是特定于该语言,那么我想这没关系
lathomas64 2010年

1
我想知道您是否可以进行游戏(游戏):P
RCIX

4
不知道' Go '是否被认为已经完成(然后再次由人为操作)。但是存储空间非常有限(至少在使用调节板的情况下)。
戴维·C·毕晓普

@ DavidC.Bishop Funny ...
Brian Ortiz

1
如果您使用围棋游戏引擎,则应确保充分利用该语言的功能,而不是像尝试使用更“常规”语言并复制已存在的语言那样尝试使用它。

Answers:


34

我对您的问题的看法:

  • 语言足够快。较慢的Java语言用于游戏开发。甚至Python(pygame)也用于游戏开发,并且比Java慢得多。这完全取决于游戏的类型以及处理器的密集程度。
  • 一般来说,垃圾收集对于游戏来说不是很好。但是,Go有一个特别糟糕的垃圾收集系统(即标记清除),它在清理内容时停止了工作。这将很难应对,并且会导致帧停帧速率。
  • 要使用goroutine制作游戏,需要大量的心理改造。传统意义上的图形和逻辑不能并发。但在较小的层次上,逻辑的某些部分是并发goroutine的最佳候选者(例如,AI决策,粒子系统等的并行处理)
  • 多人游戏服务器确实可能是围棋语言的理想选择。

我认为,如果您有强烈的欲望尝试使用一种语言编写游戏,那就去吧。显然,如果您正在考虑这样做,那么您就有这样做的热情,为什么不遵循这种热情,而不是强迫自己遵守规范?我可以说更多,但我在回答“ Ruby是否适合用于游戏开发的语言”这个问题时已经说了很多。


6
“一个特别糟糕的垃圾收集系统(标记和清除)”标记并没有天生就停止了运行-例如,Java具有并发的标记和清除收集器,而Lua长期使用一个幼稚的收集器-可以通过谨慎的代际系统控制很多暂停时间。话虽这么说,Go's 世界停滞不前的标志。但是前者而不是后者是游戏的问题。(Ruby线程对此也有一些怪异的说法。)

1
当前的Go GC系统似乎是一个占位符:“当前的实现是一个简单的标记收集器,但正在替代它”(golang.org/doc/go_lang_faq.html#garbage_collection)。讨论了替换选项;我不知道对此事有任何坚定的决定。
TSomKes 2010年

1
乔,谢谢您的澄清!我没有意识到。是的,TSomKes,我确实看到了这一点,因此我们可以寄希望于Go在某个时候实现更好的垃圾收集器。
cket病

4
请注意,对于当前的Go垃圾收集器,以上答案已经过时。Go 1.5是完全不同的球类游戏。我不知道这仍然是一个令人担忧的问题。
乔纳斯(Jonas)2015年

3
从1.8版开始,GC的并发停止时间将减少至100μs。groups.google.com/forum/#!topic/golang-dev/Ab1sFeoZg_8
Dolanor

17

我已经在Go for OSX中编写了一个小型引擎(将OpenGl用于图形窗口)。我对C ++游戏引擎(http://morganjeff.weebly.com/)有一些经验,因此在阅读了它提供的一些功能后决定尝试Go。

从Go 1.1发行版开始,go支持我编写游戏引擎所需的大多数功能(实际上是游戏核心,因为引擎会建议编辑者,而其他则不行)包括:

  • 成员函数绑定(用于消息传递系统)
  • 反射是内置的(用于序列化,外部工具支持等)
  • 接口(用于实现系统,组件等的多态行为)

使用Go(对于大型项目)的一些好处:

  • 语言内置了测试功能(包括基准测试和一些断言)
  • 例子很容易添加到语言中(为了正确起见,对它们进行了编译)
  • 易于添加特定于体系结构的代码(通过文件命名约定)
  • 语言内置了分析功能
  • 导入的内置版本控制(允许将大型二进制文件添加到与源不同的存储库中,同时保持版本控制和最新状态)

通常使用Go的一些好处:

  • 易于重构的代码
  • Go支持线程(与将其分层的C ++不同)
  • 超快的编译速度减少了对脚本语言支持的需求
  • 静态输入系统(通过隐式地通过鸭子输入来满足接口)
  • 多个返回值,命名参数,带标签的结构属性
  • 出色的内置工具和文档
  • 托管语言

使用Go的一些缺点:

  • 没有宏或模板
  • 没有更成熟语言的库支持
  • 托管语言(故意列出两次)
  • 没有IDE

有很多方法可以获取原始内存(导入“不安全”),我将链接一篇文章,展示如何配置go程序的内存和速度。总而言之,Go声称它是现代C语言似乎很真实。我认为它是“智能”设计的(比我提到的原因要多得多),而且更重要的是,它有据可查。使用Go设计的引擎与使用C ++设计的引擎(我仍然会习惯)有所不同,但是Go引擎解决了许多在C ++中并未真正解决的问题(即并行性, C ++语言的复杂性以及对继承的滥用)。

这是我答应过的文章:http : //blog.golang.org/2011/06/profiling-go-programs.html

杰夫


尝试使用GoSublime进行Sublime,它确实感觉像是一个IDE,并且比许多(如果不是全部)Java IDE更具反应性。
Arne

1
您能否指定“导入的内置版本控制”是什么意思,我只是对go语言本身的version标记不满意。
Arne 2013年

@jmorgan自Go 1.2以来有什么变化,并且看到Go 1.3即将发生变化吗?
ylluminate 2014年

@Arne:好的电话!我真的很喜欢GoSublime。我没有IDE的意思是要获得可视调试器,您必须使用gogdb(这是一个很棒的工具),但是它不如visual studio好。这里就是我的意思有关程序包相关性和版本:golang.org/cmd/go/... golang.org/cmd/go/#hdr-Import_path_syntax
jmorgan

@ylluminate:老实说,Go越来越好了。它现在带有一个测试覆盖程序包,因此您可以快速查看已测试的内容和未测试的内容。我发现拥有合适的测试套件可以使我的生活变得更加轻松...所以这对我来说是一个很大的功能。Go 1.3似乎将对二进制大小和运行时速度(特别是垃圾收集器)进行改进,因此很棒。
jmorgan

4

还有一些需要考虑的事情是,由于Go仍然相对较新,因此可能尚未绑定游戏开发中使用的许多常见库。


绝对是这样。例如,我遇到了两个Go / SDL项目,其中一个似乎已被放弃。我发现很少有(使用相对较小的一种)使用它们的游戏。
TSomKes

1
您绝对应该查看github.com/go-gl,它不是SDL,但如果使用OpenGl,则是一个不错的选择。对于矢量,有github.com/Jragonmiris/mathgl,但我在那里发现了错误。Go make非常易于包装C库,根本不需要makefile。您也可以导入C头文件并直接使用其功能。
Arne 2013年

0

不要使用Go来开发游戏,它只是在你脖子上的信天翁。游戏开发工具链的扩展范围远远超出了编写语言的范围,以至于您会发现每一个转弯处都存在障碍,而如果您仅凭某种已有的东西就不会存在。

不要误会我的意思,我喜欢玩新的语言,但是如果您尝试让游戏选择一种具有社区和支持的语言,那么您的状况就会更好。


9
另一方面,如果您只是要在一个小型独立项目中对某些东西进行硬编码以使用一种新的语言,则担心“工具链”被高估了。

2
我不得不在这里不同意。与游戏开发有关的大多数内容与该语言无关。问有关OpenGL的问题与使用C C ++ Go甚至Java编程无关。顺便说一下,您在说什么工具链?为什么不兼容呢?
Arne 2014年
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.