我正在用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
运行得慢很多.
屏幕上的所有内容都是文本或线条,没有加载图像。我怀疑我在做傻事。
我知道我只能更新"脏矩形",但我想知道我是否错过了一些更基本的东西。
提前感谢!
您可以使用窗口作为目标图面来保存一个 blit:
pygame.transform.scale(screenPrescaled, (1920, 1080), window)
如果它仍然太慢,则应使用更新矩形,您可以使用与缩放图像 1920/640 和 1080/480 相同的因子来缩放它们。
最简单的方法是不使用
pygame.display.flip()
是使用
pygame.display.update()
这并没有太大的区别,但它在我的游戏中效果很好,尤其是当它使用大量图片时。
您正在通过display.flip()
更新一个巨大的屏幕。在 SDL(这落后于 pygame)中,这不是一个好主意(尝试删除所有内容,看看它运行得有多快,它不应该快得多)。
我没有办法衡量,但我猜你的代码需要很长时间的原因是.flip()
的问题。
既然您只处理 640x480 的数据,为什么要将其扩展到如此巨大的维度?尝试将屏幕设置为640x480,然后看看它会有多快。我想它应该跑得快四到五倍。