【问题标题】:Is PyOpenGL as fast as OpenGL?PyOpenGL 和 OpenGL 一样快吗?
【发布时间】:2014-12-06 05:09:53
【问题描述】:

我正在尝试用 Python 和 PyOpenGL 构建一个通用游戏引擎,但我不知道是否值得尝试,因为我不确定 Python 是否能胜任这项工作......

据我所知,PyOpenGL 只是 OpenGL 的包装器。然而,我仍然看到有人说诸如“OpenGL 更好”和“Python 太慢”之类的话。

例如,看一下this question。大多数答案都偏向于 C++。

如果它们都使用相同的技术,那么为什么其中一种会比另一种更好呢?对我来说,语言似乎并不重要,因为大部分工作都是由 OpenGl/硬件完成的。我错过了什么?

【问题讨论】:

  • python 仍有一些开销......但我认为它通常值得付出代价,因为 python 通常更具可读性并且它通常“足够快”
  • 我不确定还能说些什么。您链接的帖子的最佳答案完美地解释了它。它适用于许多任务,但不等同于本机代码。如果您想用 OpenGL 做任何有趣的事情,那么您将在您的应用程序中拥有一个与您的 OpenGL 渲染器通信的状态。更新该状态将需要您在 python 中进行的计算。更不用说最后我检查了一些流行的 python 实现仍然无法在多个内核上执行任意多线程。
  • 只做原始 OpenGL,Python 的开销可以忽略不计。为了进行用于为 OpenGL 提供数据的计算……好吧,在不知道您打算进行哪种计算的情况下,没有人可以告诉您 Python 是否“足够快”。如果您有更具体的问题,请提出。如果不这样做,您的问题只是您链接的问题的更广泛的重复。

标签: python c++ opengl


【解决方案1】:

第一个区别:OpenGL 是一个规范,而不是一个库。所以比较 PyOpenGL 和 OpenGL 就像比较蓝图和房子一样。

回答您的问题:Python 是一种解释型语言,类似于 Java。游戏引擎需要非常密集的计算,不仅是图形,还包括物理、AI、动画、加载 3D 文件等。PyOpenGL 可能足以处理好图形,但 Python 不足以处理所有 CPU 端代码。

当然,这也取决于您的游戏引擎的“级别”:对于简单/学术游戏,Python 可能会完美运行,但不要指望 Cryengine 可以使用它。

【讨论】:

  • 好吧,我只是为了教育目的。所以我想它应该工作?如果我改用 Cython 会有所不同吗?
  • 我不是 Python 专家,但据我所知,他们在 JIT 编译方面做得很好(参见 PyPy project),并且可以与 C++ 等编译语言竞争。话虽如此,如果值得付出努力,您以后总是可以在 C++ 中实现计算密集型的东西并在 Python 中作为库导入。
  • 出于教育目的,python 很好。 Cython 可能允许您快速实现一些 CPU 密集型代码,但 IMO,对于第一次尝试,没有必要增加它的复杂性。
  • "OpenGL 是一个规范,而不是一个库" 我想知道 'OpenGL' 中的 'L' 代表什么?
  • @Viliami 开放图形语言
【解决方案2】:

这样想:“您的应用程序和 GPU 驱动程序之间有多少抽象层。让我们看看。使用 Python,您拥有 Python 解释器,它读取、解析并将您的代码转换为中间代码(Python 字节码)@987654321 @ 和运行时解释该字节码并执行它。现在,如果你使用 OpenGL 库,这意味着之后 Python 应该通过一些抽象层调用 GL 方法,可能类似于包装 OpenGL API 函数指针的 Java JNI(通常它是 C++ 共享库)。只有在此之后,GL 命令才会提交给您的 OpenGL 驱动程序。这也是它在 Java、C# OpenGL 包装器中的工作方式。

现在,如果您使用 C++,我将在此省略 C++ 作为本地语言(直接编译为机器字节码)相对于基于虚拟机/解释器的所有明显优势,您可以直接调用这些 GL API 方法(一旦它们在启动时加载)通过像 GLEW 这样的扩展库。没有接口或包装器。因此,您不仅可以利用 C++ 性能,还可以利用该语言所谓的“接近金属”能力直接与图形 API 交互,无需任何中介通常会在繁重的应用程序中导致明显的开销。

但是,正如其他人所说,这实际上取决于您的应用程序的性质。如果您从事一些原型设计或科学模拟,结果比性能更重要,那么 Python 可能就足够了。但如果您的目标就是从你的 GPU 中挤出所有你应该去原生的东西。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多