【问题标题】:Using Cython for game development?使用 Cython 进行游戏开发?
【发布时间】:2010-11-15 01:46:21
【问题描述】:

使用 Cython 作为游戏的主要编程语言有多实用?

我是一位经验丰富的 Python 程序员,我非常喜欢它,但在游戏编程方面,我无疑是个新手。我知道 Python 通常被认为太慢而无法进行任何严肃的游戏编程,这就是为什么 Cython 对我来说很有趣。借助 Cython,我可以使用类似 Python 的语言,速度堪比 C。

我知道无论如何我可能需要学习一点 C/C++,但相比之下,Cython 似乎会加快开发时间。

那么,实用吗?我还能使用 OpenGL、OpenAL 和 Bullet Physics 等 C/C++ 库吗?

【问题讨论】:

标签: python c cython


【解决方案1】:

如果您正在使用这样的组合并且您的目标是编写 3D 游戏,那么您可能会从具有成熟物理和音频绑定的现成 3D 引擎以及像 @ 这样的 Python API 获得更好的体验。 987654321@ 或Panda3D。即使您不这样做,这篇关于 using Cython with Panda3D 的帖子也可能会有所帮助。

我现在不确定,但是back in 2007,两者之间的权衡基本上是这样的:

  • Panda3D 被更好地记录和设计为一个 C++ 加速 Python 引擎(显然他们做出了一些 C++ 引擎项目不会发生的 API 设计决策),并且可以预见的是,它拥有更成熟的 Python API .
  • PyOgre 建立在一个更先进的引擎之上,拥有一个更大、更有活力的社区。​​li>

...但是,考虑到时间的流逝,2007 年,Panda3D 仍处于不兼容 GPL 的许可证下,这很可能已经改变了很多人。 (包括我自己)

【讨论】:

  • +1 用于设法为这个问题提供一个可能有用的答案。我认为这是没有希望的。
  • 请注意,Python-Ogre 现在几乎已经死了,尤其是在网站完全消失之后:-(
  • 从Working with NumPy 教程来看,Python-OGRE 的网站已经死了,因为 Python 绑定现在正式成为 OGRE 3D 项目本身的一部分。
【解决方案2】:

我是Ignifuga Game Engine 的开发人员,它面向 2D 并基于 Python/Cython/SDL。我一般做的是用 Python 开发代码,然后对引擎进行剖析,看看是否有一些明显的瓶颈(主循环、渲染代码都是很好的候选者),然后将这些模块转换为 Cython。然后我通过 Cython 运行所有代码(基于 Python 和 Cython),并针对 SDL 静态编译它。 Cython 的另一个大“优点”是绑定到 SDL 或任何基于 C 的库几乎是微不足道的。 关于线程,该引擎目前是单线程的,通过 Greenlets 进行协作多任务处理,尽管这来自于设计决策,以减轻没有经验的开发人员可能陷入的潜在多线程陷阱,而不是对 Cython 的限制。

【讨论】:

  • 嘿,网站上的源代码链接坏了,博客已经10个月没有更新了。我喜欢看这个项目,因为将 python 中的所有机器学习内容引入游戏开发中会很棒。 Greenlets 听起来很可怕,但现在有更新的线程解决方案。此外,随着 GIL 被移除的可能性,这可能会起飞!
【解决方案3】:

在这个日期(2011 年 4 月 12 日)unixmab83 是错误的。

Cython 不禁止使用线程,您只需要使用 no_gil 特殊语句即可。

除了 c++ 的绑定之外,现在可以在 cython 中使用。

我们确实将它用于接近游戏开发的东西。因此,虽然我不能最终确定,但 cython 是一个有效的候选人。

【讨论】:

    【解决方案4】:

    我发现很多时候,尤其是对于较大的库,您最终会花费大量时间来配置要构建的 Cython 项目,知道要导入哪些结构,将 C 代码桥接到 Python 中方向等。虽然 Cython 是一个不错的权宜之计(并且比纯 C/C++ 开发更令人愉快),但您必须学习有效使用它的 C++ 数量基本上意味着您将不得不硬着头皮学习无论如何都是 C++。

    PyGame 怎么样?

    【讨论】:

      【解决方案5】:

      我了解 Cython,而您不必了解 C/C++。 您将使用静态类型,但非常容易。 最难的部分是让编译工作,我认为在 Windows 上这是通过 Visual Studio 完成的。 有一个标准库之类的东西,例如包括数学。速度增益不是太大,但这取决于您的范围。 ctypes 快得多(纯 C),但与 Python 的连接非常慢,所以我决定寻找仍然可以动态的 Cython。

      为了在游戏中提高速度,Cython 将是正确的选择,但我认为这种性能也是有限的。

      【讨论】:

        【解决方案6】:

        线程!!!一个好的现代游戏必须使用线程。 Cython 实际上禁止使用它们,始终持有 GIL(全局解释器锁),使您的代码按顺序运行。

        如果您不是在编写大型游戏,那么 Python/Cython 就可以了。但是如果没有良好的线程支持,Cython 就不是一门现代语言。

        【讨论】:

        • 如果您的代码不涉及 Python 对象,您可以在 nogil 块中释放 GIL。函数也可以注释为“nogil”。如今,Cython 拥有原生数组,因此您可以在不接触 Python 对象的情况下做很多事情。
        猜你喜欢
        • 2019-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 1970-01-01
        相关资源
        最近更新 更多