更换表面而不是刮擦表面

时间:2018-11-05 12:02:42

标签: python pygame

我在pygame中遇到一些性能问题,因此我正在尝试优化渲染。

目前,我正在将背景图像涂抹到显示缓冲区中:

self.display.blit(self.bg, (0, 0))

相反,我正在寻找一种用背景表面的副本替换缓冲区并绘制的方法。这样,我不必每帧都放大大图像,从而节省了一些时间。

有什么办法吗?

2 个答案:

答案 0 :(得分:1)

多少次在屏幕表面消隐无关紧要,因为只有在调用pygame.display.updatepygame.display.flip之后,显示屏才会更新。 / p>

如果您确定将整个背景图像拖到屏幕表面 是游戏的瓶颈,则可以尝试以下操作:

a)使用clear()函数从屏幕上“擦除”精灵,而不是每帧都涂满整个背景。

b)不用在没有参数的情况下调用pygame.display.flippygame.display.update,而是在{{1}返回的情况下使用屏幕上已更改的区域列表来调用pygame.display.update 3}}函数(可能与clear()结合使用)。

c)使用FULLSCREENDOUBLEBUFHWSURFACE标志创建显示表面。

但是正如我已经说过的:请确保您知道瓶颈在哪里。一些常见的性能陷阱是:从磁盘多次加载图像,字体渲染,使用不同的像素格式(例如,在从图像创建的表面上不调用convert / convert_alpha)以及通常缺乏缓存。

(还请注意,在创建图形要求很高的游戏时,通常不是python / pygame的首选)

答案 1 :(得分:0)

没有看到您的代码,很难真正看到瓶颈在哪里。斯洛特(Sloth)的观点是正确的,可以作为优化的方法。以我的经验,所有图像都应在游戏主循环之外进行预处理,方法是将其绘制到自己的表面上。使表面到表面的条纹比使图像到表面的条纹要快得多。

cg$rec_its.trans_date          := sysdate;

这发生在游戏循环之外。在游戏循环中,您将图像表面涂抹到表面上。如果您真的想评估您的代码,请使用cProfile。这将帮助您准确确定瓶颈所在。在游戏主循环外进行尽可能多的预处理。

Python getting meaningful results from cProfile

此链接确实帮助我了解了cProfile。懒惰也是正确的,因为pygame受到限制,因此您将需要尽可能优化所有内容。这就是cProfile出现的地方。

...此外,请确保仅绘制用户可见的内容。这确实可以帮助提高性能。