问题
I am working on a small game (as a hobby) using Pygame. Before this I never worked on graphical interfaces and I am encountering some performance issues. Even in the options menu the FPS seem to be capped at around 110, which maybe doesn't sound that bad, but considering it is just a black screen with some text on it the FPS definitely should be higher. This is the code for one of the textboxes:
font = pygame.font.SysFont("Comic Sans MS", 180)
color = (0,60,20)
screen.blit(font.render("Title", False, color), (480,0))
The options menu is nothing but around 15 of those textboxes and this already causes FPS issues. Is something wrong with how I am rendering or blitting the text?
回答1:
Do not create the pygame.font
object in every frame and do not render the text in every frame. Create the text Surface once at the begin of the program or in the constructor (__init__
) of a class. Just blit
the text Surface in every frame:
At initialization:
font = pygame.font.SysFont("Comic Sans MS", 180)
color = (0,60,20)
text_surface = font.render("Title", False, color)
Once per frame:
screen.blit(text_surface, (480,0))
If the text is dynamic, it cannot even be pre-rendered. However, the most time-consuming is to create the pygame.font object. At the very least, you should avoid creating the font in every frame.
In a typical application you don't need all permutations of fonts and font sizes. You just need a couple of different font
objects. Create a number of fonts at the beginning of the application and use them when rendering the text. For Instance:
fontComic40 = pygame.font.SysFont("Comic Sans MS", 40)
fontComic180 = pygame.font.SysFont("Comic Sans MS", 180)
# [...]
来源:https://stackoverflow.com/questions/64563528/how-to-render-blit-text-in-pygame-for-good-performance