OpenGL в python замедляется вызовами glCheckError - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь оптимизировать производительность этого кода фрактального рендеринга, который нашел: https://github.com/HackerPoet/PySpace

При рендеринге некоторых фракталов я получаю приличную производительность при средних разрешениях (~ 50 кадров в секунду при 720p),Однако, когда геометрия становится немного более сложной, она полностью падает примерно до 2 кадров в секунду.Из того, что я могу извлечь из использования cProfile, это происходит из-за большого количества длинных вызовов glCheckError (рисунок ниже). Поскольку это никогда не вызывается в самом коде, я считаю, что что-то в геометрии вызывает ошибкикоторые не обрабатываются должным образом при попытке нарисовать объект.Я не уверен, если это так, хотя.Есть идеи, как мне найти точного виновника?

Вот вывод профилировщика (записано более 20 кадров, чтобы избежать спама в печати) для быстрого и медленного фрактала:

Profile of 20 frames for a

Profile of 20 frames for a slow running fractal

1 Ответ

0 голосов
/ 09 февраля 2019

Функции pyOpenGL для получения ошибок OpenGL: glGetError и gluErrorString Вот пример функции, которая получает строку ошибки и печатает ее

from OpenGL.GL import *

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

ByПереместив вызов в функцию проверки ошибок, вы можете быстро разделить вызовы OpenGL, чтобы найти строку, которая вызывает ошибку.Часто вызов, вызвавший ошибку, более показателен, чем сама ошибка, поскольку существует только несколько возможных кодов ошибок OpenGL.

После отладки вашей программы вы можете отключить проверку ошибок, поскольку она немногодорого.По умолчанию он включен, чтобы сделать pyOpenGL более удобным для начинающих.
Чтобы отключить проверку ошибок в PyOpenGL, необходимо установить для флага OpenGL.ERROR_CHECKING значение False

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