我在pygame中遇到一些性能问题,因此我正在尝试优化渲染。
目前,我正在将背景图像涂抹到显示缓冲区中:
self.display.blit(self.bg, (0, 0))
相反,我正在寻找一种用背景表面的副本替换缓冲区并绘制的方法。这样,我不必每帧都放大大图像,从而节省了一些时间。
有什么办法吗?
答案 0 :(得分:1)
多少次在屏幕表面消隐无关紧要,因为只有在调用pygame.display.update
或pygame.display.flip
之后,显示屏才会更新。 / p>
如果您确定将整个背景图像拖到屏幕表面 是游戏的瓶颈,则可以尝试以下操作:
a)使用clear()
函数从屏幕上“擦除”精灵,而不是每帧都涂满整个背景。
b)不用在没有参数的情况下调用pygame.display.flip
或pygame.display.update
,而是在{{1}返回的情况下使用屏幕上已更改的区域列表来调用pygame.display.update
3}}函数(可能与clear()
结合使用)。
c)使用FULLSCREEN
,DOUBLEBUF
和HWSURFACE
标志创建显示表面。
但是正如我已经说过的:请确保您知道瓶颈在哪里。一些常见的性能陷阱是:从磁盘多次加载图像,字体渲染,使用不同的像素格式(例如,在从图像创建的表面上不调用convert
/ convert_alpha
)以及通常缺乏缓存。>
(还请注意,在创建图形要求很高的游戏时,通常不是python / pygame的首选)
答案 1 :(得分:0)
没有看到您的代码,很难真正看到瓶颈在哪里。斯洛特(Sloth)的观点是正确的,可以作为优化的方法。以我的经验,所有图像都应在游戏主循环之外进行预处理,方法是将其绘制到自己的表面上。使表面到表面的条纹比使图像到表面的条纹要快得多。
cg$rec_its.trans_date := sysdate;
这发生在游戏循环之外。在游戏循环中,您将图像表面涂抹到表面上。如果您真的想评估您的代码,请使用cProfile。这将帮助您准确确定瓶颈所在。在游戏主循环外进行尽可能多的预处理。
Python getting meaningful results from cProfile
此链接确实帮助我了解了cProfile。懒惰也是正确的,因为pygame受到限制,因此您将需要尽可能优化所有内容。这就是cProfile出现的地方。
...此外,请确保仅绘制用户可见的内容。这确实可以帮助提高性能。