Pyglet.clock.schedule значимая функция, вызывающая ограничение скорости - PullRequest
0 голосов
/ 12 ноября 2018

Я обнаружил определенное несоответствие в скорости Pyglet: pyglet.clock.schedule и pyglet.clock.schedule_interval (с аргументом интервала ниже некоторого значения), вызываем функции.

Кажется, что обе команды показывают некоторый общий порог интервала, который они могут вызывать функцией. Это может быть связано с ограничениями производительности оборудования, если пороговая скорость не была низкой - макс. около 30 вызовов функции в секунду.

Код теста и результаты можно увидеть ниже:

import pyglet
from time import time

window = pyglet.window.Window()

last_update = time()

def update(dt):
    global last_update
    print("dt: ", dt)
    print('Measured dt: ', time()-last_update)
    last_update = time()

@window.event
def on_draw():
    dt = pyglet.clock.tick()
    print('Last clock tick: ', dt, "\n")

pyglet.clock.schedule(update)
pyglet.app.run()

Результат выборки:

dt:  0.030516604423768356
Measured dt:  0.03125262260437012
dt:  0.0007512663764779326
Measured dt:  0.0
Last clock tick:  0.0007512663764779326 

Несмотря на то, что dt = pyglet.clock.tick() побуждает вызвать функцию update(dt), значение dt которой соответствует ожидаемому возвращаемому значению clock.tick(), первый вызов почти всегда возвращает одно и то же фиксированное значение dt, указывая максимальная частота, которую интервальные функции Пиглета вызывают функцию обратного вызова, составляет примерно 30 - 32 раза в секунду.

Я не уверен, что может повлиять на такую ​​низкую частоту, но я думаю, что такая производительность может быть следствием какой-то неисправности. Доказательством этого является, по крайней мере, использование более высоких частот (например, 120 FPS) среди примерных программ издателей.

В чем может быть причина того, что он работает так медленно, и можно ли каким-то образом фиксировать интервальные функции pyglet для обновления функций обратного вызова с соответствующей заданной частотой, не ограниченной скромным ~ 30 в секунду? Заранее спасибо за помощь.

PS clock.schedule_interval можно манипулировать, только если его интервал больше 1/30.

PPS Наличие методов печати не влияет на пороговую скорость функций интервала.

1 Ответ

0 голосов
/ 12 ноября 2018

Попробуйте установить предел FPS на более высокое значение:

pyglet.clock.set_fps_limit(60)

Похоже, что pyglet устанавливает это ограничение на довольно низкое значение по умолчанию в некоторых случаях: FPS с Pyglet половина частоты обновления монитора

Может также помочь установить vsync в false:

class Window(pyglet.window.Window):
    def __init__(self, refreshrate):
        super(Window, self).__init__(vsync = False)

Редактировать: Как указано в комментариях, set_fps_limit устарела. Решение с schedule_interval будет выглядеть примерно так:

pyglet.clock.schedule_interval(self.on_draw, 1.0/60.0)
...