能否用纯Python编写一个像《魔兽世界》那么大的3D游戏?

13

纯Python能否编写像《魔兽世界》这样大型的3D游戏?假设使用DirectX/D3D绑定或OpenGL绑定。

如果不能,那么在Python中完成这样的项目最大的障碍是什么?我知道游戏通常属于C和C++领域,但有时人们会出于习惯而选择其他语言!

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

编辑:

GIL对3D客户端性能是否会造成重大影响?使用OpenGL或DirectX绑定相对于本地使用库的一般性能惩罚是多少?


7
你问过EVE Online的开发团队了吗?他们使用Python语言。http://www.eveonline.com/ - S.Lott
我觉得今天的浏览量有问题,它仍然报告为0。哈哈 - Malfist
2
我本想提到EVE,但我认为它主要是C++编程语言,配合Python脚本。 - Ed James
也许他们加入了眼球追踪功能,但可能还没有人完整地阅读过这个东西... - GalacticCowboy
1
重复:https://dev59.com/CHRC5IYBdhLWcg3wKtv2 - S.Lott
1
@S.Lott 相似是的,但不重复。这关乎语言的限制,而非使用某种好的语言来做 X 的问题。 - Malfist
13个回答

17

是的,但它的性能如何还有待观察。

一个好的开发模式是先用纯Python开发,然后进行性能分析,将性能关键瓶颈重写为C/C++/Cython甚至更高效的Python代码。


4
实际上,这将是一种不良的开发模式。没有一个成功的游戏是这样开发出来的。有丰富的科学知识可以告诉我们什么在游戏中表现得很好,什么不行,而不需要承担重写成本。例如,你不会用Python编写你的网络、碰撞或图形模块。 - Justicle

14

虽然我不知道《魔兽世界》的所有技术细节,但我认为像它这样规模的大型 MMO 游戏可以使用Stackless Python来构建。

EVE Online 使用了它,他们只有一个服务器,支持 20 万用户。


据我所记,同时在线的最大用户数约为50k。 - praavDa
1
为什么特别选择 Stackless Python? - Edmund
EVE还将大量代码推向C。因此,它本身不会是纯Python。 - Noob Saibot

9

从技术上讲,在任何图灵完备的编程语言中都可以实现任何功能。

但在实际应用中,如果使用高级语言构建网络堆栈,服务器需要非常快才能处理如此多的玩家,这将会遇到麻烦。

客户端的游戏部分应该没有问题,因为GUI、任务或键盘输入等内容并不太复杂。

问题将出现在服务器上需要进行的计算密集型操作上。如果某些操作需要立即完成且涉及到一万个用户以上,最好使用C语言编写的外部库。

现在可能会有一些Python大师出来反驳我的话,因为正如我在开头所说,从技术上讲,只要付出足够的努力,任何事情都是可以做到的。


暴雪有不止一个服务器,一个服务器不必处理所有玩家。 - Malfist
一方面,你在谈论一种语言,另一方面,你在谈论实现。不要混淆它们。如果没有实现,你不能在图灵完备的语言中做任何事情。 - egaga
实际上,用高级语言构建网络堆栈时会遇到麻烦,因为服务器必须非常快才能处理如此多的玩家。问题在于你可以为服务器端提供更好的硬件设备,但在客户端这样做就比较困难了。 - Jason Baker
3
技术上讲,任何图灵完备的编程语言都可以实现任何事情。至少可以实现在通用图灵机上可行的事情 :) - mipadi

7

游戏Minions of Mirth是一个完整的MMO,与魔兽世界差不多规模,并且主要使用Python语言进行开发。客户端使用了Torque游戏引擎,该引擎由C++编写,但服务器代码和行为都是用Python实现的。


6

是的,你可以使用汇编、Java、Python或brainfuck来编写它。这只取决于你愿意花多少时间去做它。语言性能已经不再是一个主要问题了,更重要的是你使用哪些算法,而不是你使用什么语言。


7
有些人从未尝试过用Python编写详细的物理模拟,或在MATLAB中运行复杂的计算机视觉算法。相信我,我们还没有达到所有语言在性能方面可比较的阶段! - Ed James
寻找一个旧的TRUESPACE下载网站。我相信那是Python。 - ryansstack
@shoosh,这只是一个例子。如果你真的下定决心,你就能做到。这可能需要你一生的时间,但你“能够”做到。 - Malfist

6
除了《EVE Online》之外,还有一些其他真实的行业案例。在90年代末期Origin公司的《终极在线2》项目中,服务器后端主要使用Python构建在C++服务器基础设施上,而NCSoft公司的游戏《太空堡垒》(由大部分相同的开发团队制作)也采用了相同的架构。 Twisted Matrix Python服务器框架最初就是为此目的而创建的——实际上是当时UO2项目的一名开发人员创建的,还有一家名为Ninjaneering的公司试图通过MMO项目商业化这个代码库。
现在越来越多的游戏采用Lua作为脚本引擎(例如EQ2),因为它更容易嵌入和实例化。
在这种环境下,Python的问题通常出现在语言之间的接口上。当你不可避免地将一些高性能系统从Python移植到C/C++时,跨语言边界推送数据和调用函数就成了一个问题。如果序列化做得不好,其代价可能很高。例如,使用早期版本的SWIG会将指针序列化为字符串表示,然后在另一端解析字符串回到指针!!
查看这篇90年代中期的this论文:
但是,从长远来看,我认为这是可能的。

5

针对你的具体问题,“...用纯Python实现...” 答案是否定的。

Python的速度不足以有效地调用OpenGL或DirectX以在可接受的帧速率下重新创建《魔兽世界》。

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


5
由于你的主要问题已经得到很好的回答,我将回答您后来的问题:
GIL对3D客户端性能是否会造成重大问题?
在Python 2.6中引入了multiprocessing库,因此您可以利用多个处理器核心而不必担心GIL。 Stackless Python也有一些非常酷的相关内容。
使用OpenGL或DirectX绑定与本地使用库相比,通常会有什么性能损失?
我没有任何基准测试可以支持,但是使用绑定与本地库相比的惩罚足够小,您不必担心它。

4
我一直在尝试用Python编写3D游戏,并使用了一个很好的渲染框架(我最喜欢的是OGRE)和不错的绑定,你会惊讶于你能够做到什么。但是,特别是对于游戏,你总是试图尽可能地挤出硬件性能。 Python的性能劣势最终会显现出来。
我在使用Python时遇到的主要问题是其巨大的调用开销。即使从其他Python函数调用Python函数也非常昂贵。 在某种程度上,这是你为使用Python的动态性所付出的代价。 当你在符号上使用函数调用运算符“()”时,它必须确定它是函数还是类,查看方法解析顺序,处理关键字参数等等。 所有这些事情都在不那么动态(编译)的语言中提前完成。
我已经看到有人试图通过手动内联函数调用来克服这个问题。 我不必告诉你这种方法比疾病更糟糕。

2
作为一名技术人员,我知道:
如果可以用C\C++编写,那么它也可以用汇编语言编写(虽然需要更长的时间)。 如果可以用C\C++编写且不是低级代码,则可以在任何托管环境中编写。 WoW是一个高级程序,使用C\C++编写。 Python是一个托管环境。
因此: WoW可以使用Python编写,因此其他任何3D MMORPG也可以使用Python编写...
最困难的部分将是3D引擎,因为它是代码中最“重”的部分-您需要使用外部引擎(使用C\C++\汇编语言编写)或编写并优化自己的引擎(不建议)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接