用Python编写的3D OpenGL游戏能够表现出色并且运行速度快吗?

16

我计划使用jMonkeyEngine,在Java中编写一个简单的3D(等轴测视图)游戏——没什么花里胡哨的东西,只是想学习一些关于OpenGL和编写高效算法(随机地图生成算法)的知识。

当我在计划要做什么时,开始考虑是否转向Python。我知道Python并不是为编写3D游戏而存在的工具,但是用这种语言编写好看的游戏可行吗?

我心中有着3D图形、漂亮的特效和剩余CPU时间来提供给游戏引擎其它部分的想法。我看过一些好看的Java游戏——老实说,当我看到《RuneScape HD》达到的细节水平时,我感到相当震惊。

另一方面,pygame.org只有2D游戏,并有一些正在进行中的3D项目。有没有高效的Python 3D游戏引擎?PyOpenGL是唯一的选择吗?Python中的好看游戏并不流行或不可能实现吗?

对于任何信息/反馈,我都将非常感激。


以下是一些你应该检查的模块:ModernGLpygamepymunkpyglet - Szabolcs Dombi
8个回答

19
如果你担心3D性能问题:大部分性能关键部分将由OpenGL(使用C库甚至硬件)处理,因此驱动它的语言不应该太重要。
要真正确定性能是否存在问题,您必须尝试一下。但原则上没有理由它不能工作。
无论如何,你仍然可以优化关键部分,无论是在Python中还是通过转换为C。对于大多数不那么性能关键的游戏引擎,你仍然可以获得Python的好处。

1
使用ModernGL 代替 PyOpenGL。它易用快速,无需 ctypes。它不是游戏引擎,而是以 Python 风格访问 OpenGL。 - Szabolcs Dombi

8

6
值得注意的是,Eve 的很多功能都是用 C++ 实现的。但是它是由 Python 来维持整体运转的。 - Kylotan

4
我做了一个关于用Python驱动OpenGL的业余尝试的EuroPython演讲:http://pyvideo.org/video/381/pycon-2011--algorithmic-generation-of-opengl-geom
我谈论的代码的最新版本在这里:https://github.com/tartley/gloopy
它被称为“库”,但那是我天真了:它只是一堆个人实验性代码。
然而,它证明了你可以从Python中以60fps移动数百个几何图形。
虽然上面的演示比较简单,只使用了简单的几何图形和未纹理化的面,但我发现更详细的几何图形、纹理映射或其他更现代的图形效果并不会对帧率产生实质性影响。或者至少它们对帧率的影响不会比在C程序中使用相同效果时更差。它们在GPU上运行,因此如果你的程序是用Python编写的,这根本没有任何区别。
从Python创建动态几何图形(例如通过弯曲或融化形状移动单个顶点)在性能上是敏感的。每帧都这样计算每个顶点,然后从结果构造一个新的ctypes数组,再将该几何图形传输到GPU,这样会很慢。相反,你应该在顶点着色器中做这个。
另一方面,如果你只想进行仿射变换(移动物体、旋转它们、打开抽屉、旋转汽车轮子、弯曲关节式机器人臂),那么所有这些都可以由GPU完成,你的程序是用Python编写的这一事实对性能影响很小。

2
你可能想要查看Python-Ogre。我自己也试过了,没有什么严重的问题,看起来相当不错。

我一直在考虑将WiiTanks重写为PC版本,并一直在尝试使用PyGame...但是Ogre看起来非常有前途-非常感谢提供的链接! - Jon Cage
@JonCage 你有没有用Python写过这个? - johnny
我已经完成了一些基本工作,但没有什么值得发布的。 - Jon Cage

2
我推荐使用pyglet,它与pygame类似,但具有完全绑定OpenGL的功能。您可以从简单的2D游戏开始,以掌握该系统,并逐步升级到3D游戏。这是比PyGame更现代的系统,后者建立在SDL周围,而SDL在今天已经有点老了。

1

也许有点离题,但如果你的目标是学习Python,何不使用IronPythonXNA创建一个游戏呢?虽然XNA不是OpenGL,但我发现它是一个非常简单的2D/3D引擎,速度快且支持Shader Model 3.0。


1

看看Frets on Fire项目——一个开源的吉他英雄替代品。它是用Python编写的,并且在OpenGL中具有不错的3D图形。我建议查看它的源代码,以获取有关库等方面的提示。


1

几年前有一款名为“Vampires”的游戏,其中大部分甚至全部代码都是用Python编写的。不确定3D例程是否也是如此,但它可以正常运行。


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