Pyglet: нестабильный fps при использовании Vsync и никакого другого программного обеспечения

Я использую Pyopengl и Pyglet для простого приложения. Я использую Vsync для обмена буферами на частоте 120 Гц. Вот в чем проблема. Когда я запускаю многие приложения, такие как Outlook, Chrome, NotePad ++, большое приключение Доры в фоновом режиме, частота кадров в секунду достаточно стабильна на уровне 120 Гц. Но, когда я выключаю все эти приложения, fps падает со 114 Гц до 125 Гц!?!?

Я думал, что закрытие приложений действительно улучшит фпс, но нет. Мое приложение не синхронизировано. Я также думал, что количество кадров в секунду, данное Pyglet, будет между 119 и 121.

Может ли кто-нибудь помочь мне понять это? Я не вижу очевидных вещей?

Вот код

def on_draw(dt):
    cnt
    ScreenSwap
    left = True
    right = False
    Rval = 0.0/255.0
    Gval = 153.0/255.0
    Bval = 0.0/255.0

    ShapePosition(speed = 0.25)

    glClear(GL_COLOR_BUFFER_BIT)  # Clear the color buffer
    glLoadIdentity()              # Reset model-view matrix
    DrawChecker(Nbr = 16, Dark = 25.0/255, Light = 75.0/255)

    if ScreenSwap == 1:
        DrawQuestionMark(Rval, Gval, Bval, left)
        # Blue Line
        BlueLine(left)        
        # Line to see if we are dropping frame
        DropFrameTest(left)
        ScreenSwap = 0

    else:     
        DrawQuestionMark(Rval, Gval, Bval, right)    
        # Blue Line
        BlueLine(right)
        # Line to see if we are dropping frame
        DropFrameTest(right)
        ScreenSwap = 1


    fps = pyglet.clock.get_fps()
    fd.write( str(fps) + "\n")   # debug

И больше:

display = pyglet.window.get_platform().get_default_display()
screens = display.get_screens()

# Direct OpenGL commands to this window.
config = Config(double_buffer = True)
window = pyglet.window.Window(config = config, screen=screens[1],  vsync=True)
# Set full screen in separate function to avoid flicker a the start
window.set_fullscreen(True)
pyglet.clock.ClockDisplay()
#pyglet.clock.set_fps_limit(120)
fps = pyglet.clock.get_fps()
dt = pyglet.clock.tick()    
pyglet.clock.schedule_interval(on_draw, 0.001)
pyglet.app.run()
fd.close()

person BaldDude    schedule 22.07.2013    source источник


Ответы (1)


Ладно, кажется, я понимаю, что происходит.

Чтобы понять поведение, я записывал в файл время и частоту кадров каждый раз, когда рисовал кадр. Я также использовал «диспетчер задач графического процессора», чтобы получить информацию о загрузке графического процессора в определенное время (GPU-Z).

Когда у меня много приложений работает в фоновом режиме, мое приложение работает нормально, а загрузка графического процессора составляет около 25%.

Когда у меня не так много приложений, работающих в фоновом режиме, мое приложение постоянно не синхронизировано, нагрузка на ЦП выше, а нагрузка на ГП не стабильна.

Я наблюдал за двумя разными реализациями своего кода и каждый раз отслеживал активность GPU и CPU в течение 15 минут.

Сначала я предположил, что процессор берет на себя всю нагрузку... но, похоже, я ошибался.

person BaldDude    schedule 23.07.2013