python中的OpenGL被glCheckError调用减慢了速度

时间:2019-01-30 11:56:00

标签: python performance opengl optimization glsl

我正在尝试对我发现的这种分形渲染代码进行一些性能优化:https://github.com/HackerPoet/PySpace

渲染某些分形时,我在中等分辨率(720p时约为50fps)下表现不错。但是,一旦几何图形变得稍微复杂一点,它将完全下降到约2 fps。从我使用cProfile可以收集到的信息来看,这是由于对glCheckError进行了大量的长调用(如下图所示)。由于在代码本身中从未调用过此调用,因此我被认为是关于几何的某些原因导致了错误尝试绘制对象时未正确处理的对象。不过,我不确定是否是这种情况。关于如何找到确切罪魁祸首的任何想法?

以下是用于快速分形和较慢分形的探查器输出(记录20帧以避免打印垃圾邮件):

Profile of 20 frames for a "fast" running fractal

Profile of 20 frames for a slow running fractal

1 个答案:

答案 0 :(得分:1)

用于获取OpenGL错误的pyOpenGL函数是 glGetError gluErrorString 这是一个获取错误字符串并打印的示例函数

from OpenGL.GL import *

def opengl_error_check():
    error = glGetError()
    if error != GL_NO_ERROR:
        print("OPENGL_ERROR: ", gluErrorString(error))

通过将呼叫移至错误检查功能,您可以 快速平分OpenGL调用以查找导致错误的行。 通常,导致错误的调用比错误本身更具说服力,因为只有少数可能的OpenGL错误代码。

一旦调试了程序,由于价格昂贵,可能要禁用错误检查。默认情况下处于启用状态,以使pyOpenGL对初学者更加友好。
要在PyOpenGL中禁用错误​​检查,您需要设置OpenGL.ERROR_CHECKING 标记为False

import OpenGL
OpenGL.ERROR_CHECKING = False
from OpenGL.GL import *