如何在pygame中渲染/隐藏文本以获得良好的性能

问题描述

我正在使用Pygame进行小型游戏(作为业余爱好)。在此之前,我从未使用过图形界面,并且遇到了一些性能问题。即使在选项菜单中,FPS似乎也限制在110左右,这听起来似乎还不错,但是考虑到它只是一个黑屏,上面有一些文字,FPS肯定应该更高。这是其中一个文本框的代码

font = pygame.font.SysFont("Comic Sans MS",180)
color = (0,60,20)
screen.blit(font.render("Title",False,color),(480,0))

选项菜单仅是其中的15个左右文本框,这已经引起FPS问题。我在渲染或显示文字方面有问题吗?

解决方法

不要在每个框架中创建pygame.font对象,也不要在每个框架中呈现文本。在程序开始或类的构造函数(__init__)中创建一次文本 Surface 。在每一帧中仅blit文字 Surface

初始化时:

font = pygame.font.SysFont("Comic Sans MS",180)
color = (0,60,20)
text_surface = font.render("Title",False,color)

每帧一次:

screen.blit(text_surface,(480,0))

如果文本是动态的,则甚至无法预渲染。但是,最耗时的是创建pygame.font对象。至少,应该避免在每一帧中创建字体。
在典型的应用程序中,不需要字体和字体大小的所有排列。您只需要几个不同的font对象。在应用程序的开头创建许多字体,并在呈现文本时使用它们。例如:

fontComic40  = pygame.font.SysFont("Comic Sans MS",40)
fontComic180 = pygame.font.SysFont("Comic Sans MS",180)
# [...]