【问题标题】:Pygame (Python) Scale Transform SlowPygame(Python)缩放变换慢
【发布时间】:2012-07-05 17:23:04
【问题描述】:

我正在用 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 慢很多。

屏幕上的所有内容都是文本或线条,没有加载任何图像。 我怀疑我在做一些愚蠢的事情。

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

提前致谢!

【问题讨论】:

  • 扩展会很慢,所以你不希望每个循环都这样做。此外,您可以定义屏幕百分比的偏移量,就像在 OpenGL 中一样。无论分辨率如何,SVG 图形都会缩放。

标签: python pygame scaling frame-rate


【解决方案1】:

你可以通过使用 window as destination surface 来保存一个 blit:

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

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

【讨论】:

  • 谢谢!删除该 blit 并使用转换目标确实加快了速度。我将代码计时为 40fps,这很棒。
【解决方案2】:

最简单的事情是代替使用

pygame.display.flip()

是使用

pygame.display.update()

差别不大,但在我的游戏中效果很好,尤其是当它使用大量图片时。

【讨论】:

    【解决方案3】:

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

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

    既然您只处理 640x480 的数据,为什么要将其放大到如此巨大的尺寸?尝试将您的屏幕设置为 640x480,然后看看它会有多快。我认为它的运行速度应该快四五倍。

    【讨论】:

    • 谢谢!这个想法是让表面具有已知尺寸,这样我就可以在我想要的地方放置文本等。然后,我将它缩放到全屏的大小(不同的机器会有所不同)。一切都按比例缩放。你是对的,它在 640x480 下运行速度确实快了很多,但最终它不会那么小。
    • @Narrat1ve 可能是你迷失了 SDL/pygame。我知道没有办法让如此大的 blit/更新更快。但我从未尝试过 Overlay(用于视频)、用于 pygame 的 OpenGL 或其他加速方法。您可能想看看它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2015-01-19
    相关资源
    最近更新 更多