3

我正在设计一个游戏,但是这个问题适用于任何需要集群中的节点和主服务器之间双向通信的情况。我对集群很陌生,但我积极地用 Go 编程,偶尔用 D 编程。

我真的很想使用现代语言(不是 C/C++),所以我选择了这两种语言,因为:

  • 数组切片
  • 良好的并发支持
  • 跨平台和本地编译(具有多个编译器实现)
  • GC(都在精确的 GC 上工作)

我已阅读https://stackoverflow.com/questions/3554956/d-versus-go-comparisonThe D Programming Language for Game Development

在高层次上,我的游戏将完成服务器端的大部分处理,而客户端只是从他们的角度呈现游戏状态。该游戏旨在扩展,因此需要在集群中运行。组件主要受 CPU 限制,并异步更新到主服务器,与客户端共享游戏状态。大多数计算依赖于用户输入,因此这些事件需要向下发送到各个组件(因此是双向 RPC)。

我喜欢D的原因:

  • 手动内存管理
  • 模板/CTFE
  • 代码安全(@safe、合同、输入/输出)

我喜欢 Go 的原因:

  • 标准库(pprofRPC
  • 围棋套路
  • go工具(尤其go get -u是安装/更新远程依赖项)

客户端可能会用 D 编写,但这不应该对服务器产生影响。

我倾向于 D,因为手动内存管理已融入该语言。虽然它没有很好的 RPC 库,但理论上我可以实现它,但我不能优雅地在 Go 中实现手动内存管理。

考虑到在两种语言之间的选择,你会用哪一种来解决这个问题?

4

2 回答 2

5

我希望这两种方法都能奏效,而且很大程度上取决于你喜欢哪一种,但如果你在 D 中做客户端,我建议在 D 中做服务器,因为这样涉及的语言更少。如果您使用两种语言,那么从事您项目的任何人通常都必须同时了解它们,并且 Go 和 D 就目前的用户群而言都足够小,以至于很少有人会同时知道这两种语言 - 尽管如果只有您在工作它,你显然已经知道他们两个了。

但是,我要指出,如果使用 D 的问题是缺少 RPC 库,那么这不是问题,因为Apache Thrift支持D。所以,D确实有一个可靠的 RPC 库,即使它不在它的标准库中(事实上,它是 D 第一轮参与 Google 代码之夏的成果之一)。

于 2012-09-14T21:33:04.423 回答
0

我对你的游戏一无所知,如果你的服务器的良好并发性很重要,那么我投票给 Go。

我在 Go 中开发了通信服务器,使用 PUSH 技术实现通信。Go 非常适合此类任务。简洁简洁的代码,易于理解。

自动内存在并发应用程序中很重要。

客户端应用程序不像服务器应用程序那样并发。客户端应用程序应保持持续的高帧速率。

因此,没有全局 GC 锁的手动内存管理对客户端应用程序来说更好。

于 2012-09-14T23:59:24.007 回答