Рендеринг текста в Pygame вызывает отставание - PullRequest
1 голос
/ 29 февраля 2020

У меня есть функция write в моем функциональном модуле, которая выглядит следующим образом

def write(size, writing, color, x,  y):
    font = pygame.font.SysFont("corbel", size)
    text = font.render(writing,  True, color)
    D.blit(text, (x, y))

Я импортировал это в свой основной модуль и создал следующую функцию в главном модуле

def print_stats():
    write(30, f"Red player's hp {player2.hp}", (200, 50, 50),10, 10)
    write(30, f"Green player's hp {player1.hp}", (50, 200, 50),10, 60)

Пока я не помещаю print_stats() в основную l oop, игра работает отлично, однако, как только я пытаюсь запустить эту функцию, она сильно снижает FPS. Я не вижу в коде ничего, что могло бы вызвать задержку, что я делаю не так? Спасибо

Редактировать: Не знаю, будет ли это выпуск vnet, но я забыл упомянуть, что я вставил pygame.init() во все модули, из которых я импортировал, так как я впервые использую модули, и я не был уверен.

1 Ответ

2 голосов
/ 29 февраля 2020

Избегайте создания объекта шрифта в каждом кадре.
Создайте шрифт в зависимости от размера перед применением l oop. Например:

font30 = pygame.font.SysFont("corbel", 30)  
def write(font, writing, color, x, y):
    text = font.render(writing,  True, color)
    D.blit(text, (x, y))
def print_stats():
    write(font30, f"Red player's hp {player2.hp}", (200, 50, 50), 10, 10)
    write(font30; f"Green player's hp {player1.hp}", (50, 200, 50), 10, 60)

Это не решает проблему, что текст отображается в каждом кадре. Если он все еще запаздывает, то вы должны визуализировать текстовую поверхность один раз, когда player1.hp соответственно player2.hp изменяется. Например:

class Player:
    def __init__(self, color, name):
        self.color = color
        self.name = name
        # [...]

    def ChangeHp(self, val):
        self.hp += val
        self.hptext = font30.render(f"{self.name} player's hp {self.hp}", True, self.color)
D.blit(player1.hptext, (10, 60))
...