12

是否有可能用纯 Python 编写像魔兽世界一样大的 3D 游戏?假设使用 DirectX/D3D 绑定或 OpenGL 绑定。

如果不是,那么在 Python 中做这样一个项目的最大障碍是什么?我知道游戏往往属于 C 和 C++ 领域,但有时人们会出于习惯而做事!

任何信息都有助于满足我的好奇心。

编辑:

GIL 会发布关于 3d 客户端性能的主要问题吗?使用 OpenGL 或 DirectX 绑定与本机使用库的一般性能损失是什么?

4

13 回答 13

16

是的。它将如何表现是另一个问题。

一个好的开发模式是在纯 python 中开发它,然后对其进行分析,并重写性能关键瓶颈,无论是在 C/C++/Cython 中,还是在 python 本身中,但使用更高效的代码。

于 2009-05-27T16:19:57.047 回答
14

虽然我不了解《魔兽世界》的所有技术细节,但我想说像这样大小的 MMO 可以用Stackless Python构建。

EVE Online 使用它,他们有一台服务器可容纳 200,000 名用户。

于 2009-05-27T16:30:00.677 回答
9

从技术上讲,任何图灵完备的编程语言都有可能。

但实际上,使用高级语言制作网络堆栈时会遇到麻烦,因为服务器必须非常快才能处理这么多玩家。

客户端上的游戏方面应该没有问题,因为图形用户界面或任务或键盘输入以及您拥有的东西并没有什么太复杂的地方。

问题将出现在服务器上计算密集型的任何地方。在人类时间发生的任何事情(例如登录)都可能会很好,但是如果某些事情需要瞬间超过一万用户,您可能想要使用 C 语言完成的外部库。

现在一些 Python 大师会从木制品中走出来,把我的脑袋扯下来,因为正如我在顶部所说的那样,从技术上讲,只要付出足够的努力,任何事情都可以完成。

于 2009-05-27T16:21:14.597 回答
7

Minions of Mirth游戏或多或少是一个完整的 MMO 魔兽世界,主要是用 Python完成的。客户端使用了 Torque 游戏引擎,它是用 C++ 编写的,但服务器代码和行为都是 Python。

于 2009-05-27T16:32:33.170 回答
6

除了 Eve Online 之外,还有一些其他真实的行业示例。90 年代后期 Origin 的 Ultima Online 2 项目的服务器后端主要是基于 C++ 服务器基础架构的 Python,而来自 NCSoft 的已故 Tablua Rasa 游戏(与大多数相同的开发团队)具有相同的架构。

Twisted Matrix python 服务器框架最初是为了这个确切的目标而创建的——实际上是由当时 UO2 项目的开发人员创建的,并且有一家名为 Ninjaneering 的公司试图通过 MMO 项目将该代码库商业化。

lua 作为脚本引擎(例如 EQ2)已经有了发展,因为它更容易嵌入和实例化。

在这种环境下,python 的问题往往出在语言之间的接口上。当您将一些高性能系统从 python 迁移到 C/C++ 进行不可避免的优化时,跨语言边界来回推送数据和跨语言边界调用函数就成为一个问题。如果做得不好,序列化的成本可能会很高。例如,使用 SWIG 的早期版本会将指针序列化为其字符串表示形式,然后将字符串解析回另一端的指针!

查看90 年代中期的这篇论文:

但是,从长远来看,我认为这是可能的。

于 2009-06-17T00:51:39.400 回答
6

是的,你可以用汇编、Java、Python 或brainfuck 来编写它。这只是你愿意投入多少时间。语言性能不再是主要问题,更多的是关于你使用哪种算法,而不是你使用什么语言。

于 2009-05-27T16:22:05.077 回答
5

我认为您的具体问题的答案是“……在纯 Python 中……”答案是否定的。

Python 的速度不足以有效地调用 OpenGL 或 DirectX,无法以异常的帧速率重新创建《魔兽世界》。

就像许多其他人回答的那样,考虑到一些高级框架工作,可以使用具有脚本语言的 Python,但至少您需要某种用另一种语言(如 C++)编写的图形系统来处理图形。对于网络,鉴于 WoW 不是动作游戏,您可能可以使用纯 Python,但很可能该部分也需要一些非 Python 库。

于 2009-09-01T05:27:02.240 回答
5

由于您的主要问题已经得到很好的回答,我将回答您后面的问题:

GIL 会发布关于 3d 客户端性能的主要问题吗?

在 Python 2.6 中,引入了多处理库,因此您可以利用多个处理器内核而无需担心 GIL。Stackless Python也有一些非常酷的相关内容。

使用 OpenGL 或 DirectX 绑定与本机使用库的一般性能损失是什么?

我没有任何基准来支持它,但是使用绑定与本机库的惩罚足够小,您无需担心它。

于 2009-05-27T16:38:35.043 回答
4

我一直在尝试用 Python 编写 3D 游戏,并且给定了一个很好的渲染框架(我最喜欢的是 OGRE)和不错的绑定,你可以摆脱它真是太棒了。但是,尤其是对于游戏,您总是试图尽可能多地从硬件中挤出来。python的性能劣势最终会让人感受到。

我在使用 python 时遇到的主要问题是其巨大的调用开销。调用 python 函数,即使是从其他 python 函数调用也是非常昂贵的。在某种程度上,这是你为 python 的动态特性付出的代价。当你在一个符号上使用函数调用运算符“()”时,它必须确定它是一个函数还是一个类,查看方法解析顺序,处理关键字参数等。所有这些事情都提前完成较少动态(编译)语言的时间。

我见过有人试图通过手动内联函数调用来克服这个问题。我不必告诉你,这种药比疾病更糟。

于 2009-11-01T08:22:16.353 回答
2

仅仅因为它可能会带来有趣的阅读,Civilization 部分是使用 Python 编写的。谷歌返回有趣的阅读材料。

于 2009-05-31T00:46:38.690 回答
2

作为技术人员,我知道:

如果它可以用 C\C++ 编写,则可以用汇编编写(尽管需要更长的时间)。如果它可以用 C\C++ 编写并且不是低级代码 - 它可以在任何托管环境中编写。WoW 是一个用 C\C++ 编写的高级程序 python 是一个托管环境

有:WoW 可以用 python 编写,因此任何其他 MMORPG 都可以用 3D 编写......


最难的部分将是 3d 引擎,因为它是代码中“最重”的部分——您需要使用外部引擎(用 C\C++\Assebly 编写)或编写一个并优化它(不推荐)

于 2009-11-01T09:16:19.150 回答
0

Python 没有被解释——它被标记化/“及时”字节码“解释”,它没有像 Java 那样的 VM。这意味着,在英语中,它可以是 daaaaaamnfast。虽然并非总是如此,这取决于问题和库,但 python并不慢,即使在知识渊博的人中,这也是一个常见的误解(包括那些刚刚没有尝试过 python 的深度 java 引擎人员)。

于 2009-08-22T15:29:28.213 回答
0

因为 Python 是被解释的,所以与 C/C++ 相比,性能会受到影响,但是,您可能希望使用 PyOpenGL 之类的东西而不是 DirectX,以便在更多操作系统上运行。

但是,我不明白为什么你不能用 Python 编写这样的游戏。

于 2009-05-27T16:20:34.567 回答