Как написать цикл событий SDL2 / OpenGL - PullRequest
1 голос
/ 02 июня 2019

Я пишу интерактивное графическое приложение в реальном времени с использованием SDL2 и OpenGL на Python (pysdl2, PyOpenGL).Приложение непрерывно создает кадры, которые могут изменяться в ответ на ввод с клавиатуры / мыши или в зависимости от времени.

Мой основной цикл событий, скопированный из какого-то неизвестного источника в Интернете, который я не могу найти снова, выглядит (упрощенно) вот так:

event = sdl2.SDL_Event()
running = True
while running:
    # process events
    while sdl2.SDL_PollEvent(ctypes.byref(event)) != 0:
        if event.type == sdl2.SDL_QUIT:
            running = False
    # render frame
    <some OpenGL commands>
    sdl2.SDL_GL_SwapWindow(window)
    sdl2.SDL_Delay(10)

Из того, что я понимаю, задержка в 10 мс предназначена для того, чтобы дать процессору немного передышки, и действительно, когда я его убираю, загрузка процессора удваивается.

Я не понимаю, зачем это нужно.Графический дисплей имеет двойную буферизацию, и замены буфера синхронизируются с вертикальным восстановлением (60 Гц = 16 мс).Наивно можно ожидать, что если <some OpenGL commands> займет менее 16 мс, то SDL_GL_SwapWindow все равно будет вводить задержку, поэтому SDL_Delay не требуется.И если они используют больше, чем это, то программа изо всех сил старается не отставать от частоты кадров дисплея, и введение задержки может повредить.

Теперь из того, что мне сказали в ответ на другой вопрос, замена буфера и, следовательно, синхронизация восстановления не происходит, когда выполняется SDL_GL_SwapWindow, но это только помещает команду «sync & swap» в очередь OpenGL, и эта инструкция выполняется, когда все до того, как закончится,То же самое относится к <some OpenGL commands>.Но эта очередь инструкций конечна, и поэтому в какой-то момент моя программа, вместо того, чтобы ждать восстановления, будет ждать, пока в очереди инструкций будет свободное место.Конечный эффект должен быть таким же: если на одно выполнение моего цикла обработки событий требуется в среднем менее 16 мс, программа в среднем задержит достаточно долго, чтобы сделать его равным 16 мс на выполнение цикла.Итак, еще раз, зачем нужна явная задержка?

В качестве второго вопроса: учитывая, что задержка может повлиять на частоту кадров, есть ли лучший способ дать процессору покоиться?

...