Почему эта базовая программа pyglet замедляется

В настоящее время я использую pyglet 1.2alpha1 поверх python 3.4 после некоторого использования pygame. В pygame тривиально заставить основной цикл работать настолько быстро, насколько это возможно, предоставляя четкий способ оценки изменений и отмечая падения частоты кадров. Моя цель — создать не игру саму по себе, а симуляцию, и чем быстрее она будет работать, тем счастливее я буду.

Мне довольно трудно понять, как настроить частоту кадров pyglet таким же образом. Я знаю, что мне нужно деактивировать параметр vsync по умолчанию в окне и удалить ограничение fps по умолчанию, но это не решает проблему. Моя реальная попытка установить частоту кадров описана в проблемном коде ниже, который с треском проваливается (ограничен 60 кадрами в секунду).

Плюс через несколько секунд программа описала более низкие замедления до невыносимых скоростей, хотя нагрузка на нее совсем не меняется. Я понял, что виноват вызов update_true_fps, хотя я не понимаю почему: если сначала он может работать со скоростью 60 кадров в секунду, то почему через полминуты он должен работать со скоростью 2 кадра в секунду?

Проблемный код:

import pyglet
from pyglet.window import key

class Pyg:
    def __init__(self):
        self.window = pyglet.window.Window()
        self.fps = 0
        pyglet.clock.set_fps_limit(0)
        self.window.set_vsync(False)
        pyglet.clock.schedule(self.tick)
        self.update_true_fps(1)
        fps_display = pyglet.clock.ClockDisplay()

        @self.window.event
        def on_draw():
            self.window.clear()
            fps_display.draw()
            self.fps_label.draw()

    def tick(self,dt):
        if dt != 0:
            self.fps = 1.0/dt
        self.update_true_fps()

    def update_true_fps(self):
        self.fps_label = pyglet.text.Label(text="FPS:"+str(self.fps),x=self.window.width//2,\
            y=20, anchor_x='center')

    def run(self):
        pyglet.app.run()

a = Pyg()
a.run()

person Antoine Ender Ezechiel    schedule 06.01.2015    source источник


Ответы (1)


Одна из причин его медленности заключается в том, что вы создаете слишком много объектов Label. Метки плохо оптимизированы в Pyglet и включают множество операций, которые обычно выполняются медленно. Вместо того, чтобы создавать метку каждый тик, генерируйте ее только при рисовании или, что еще лучше, кэшируйте объект и просто меняйте текст при изменении частоты кадров. Вы также можете записывать значения в консоль, минуя дорогостоящие графические операции. Что касается постепенного замедления с течением времени, это может быть ошибка pyglet, утечка памяти и т. Д. Если вы не создаете так много меток, вы не должны сталкиваться с замедлением.

person Leif Theden    schedule 18.01.2015