Pygame(Python)比例变换缓慢

时间:2012-07-05 17:23:04

标签: python pygame scaling frame-rate

我正在python中编写一个简单的程序,它通过串口接收数据并更新屏幕。

因为我希望这个程序在它运行的任何计算机上看起来都一样,并且它需要全屏,我想我想在一个小的 640,480 窗口中绘制所有内容,然后每次更新帧时将其缩放到全屏窗口。

这允许我保持文本等所有偏移量相同。事实证明这真的很慢。

以下是代码的重要部分:

window = pygame.display.set_mode((1920, 1080),pygame.FULLSCREEN)    
screenPrescaled=pygame.Surface((640,480))

clock=pygame.time.Clock()


while iterations<400:
#Blit all the stuff to the prescaled surface here
    screenPostscaled=pygame.transform.scale(screenPrescaled,(1920, 1080))
    window.blit(screenPostscaled,(0,0))
    pygame.display.flip() 
    iterations+=1
    clock.tick(40)

这比40fps慢了很多。

屏幕上的所有内容都是文字或线条,没有加载图片。 我怀疑我做的事情很蠢。

我知道我只能更新“脏矩形”,但我想知道我是否遗漏了更基本的东西。

提前致谢!

3 个答案:

答案 0 :(得分:3)

您可以使用destination surface窗口保存一个blit:

pygame.transform.scale(screenPrescaled, (1920, 1080), window)

如果它继续太慢,你应该使用更新矩形,你可以使用与缩放图像1920/640和1080/480时相同的因子来缩放它们。

答案 1 :(得分:2)

最简单的事情是使用

pygame.display.flip()

是使用

pygame.display.update()

这不是一个很大的区别,但它在我的游戏中对我来说非常好,特别是当它使用大量图片时。

答案 2 :(得分:1)

您正在按display.flip()更新大屏幕。在SDL(以及背后的pygame)中,这不是一个好主意(尝试删除翻转的所有内容,并查看运行的速度,它不应该快得多)。

我无法衡量,但我猜你的代码需要很长时间的原因是.flip()的问题。

由于您只处理640x480中的数据,为什么要将其扩展到如此巨大的维度?尝试将屏幕设置为640x480,然后查看它的速度。我认为它应该快四到五倍。