How to render/blit text in pygame for good performance

…衆ロ難τιáo~ 提交于 2021-02-04 08:20:10

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!