【问题标题】:Python Pygame Super Slow with Increased Window SizePython Pygame 超慢,窗口大小增加
【发布时间】:2019-05-21 02:57:01
【问题描述】:

硬件:配备 4.2GHz i7、40 GB DDR4 RAM 和 Radeon Pro 580 8192 MB 的 iMac

-> 奇怪的是,我在下面发布的更新代码在我的 iMac 上仅以 1.6 FPS 的速度运行

我开始用 pygame 制作一个游戏,它变得异常缓慢。我发现拥有更大的窗口会显着降低 fps,即使没有显示任何内容。为了证明这一点,我创建了下面的简单程序。每次迭代,它都会略微增加窗口大小。

起初,游戏窗口(上面没有显示任何内容)以 100x100 像素的大约 150 fps 运行。当它增加到 1000x1000 像素时,它的运行速度仅为 2 fps。

我做错了什么?如果fps这么低,我将不得不放弃制作我的游戏。感谢您的帮助。

import pygame, time
pygame.init()

display_width = 100
display_height = 100
win = pygame.display.set_mode((display_width, display_height))
clock = pygame.time.Clock()

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    win.fill((0, 0, 0)) #fills over pre-existing elements

    pygame.display.update()
    clock.tick()
    print(clock.get_fps())
    display_width += 1
    display_height += 1
    win = pygame.display.set_mode((display_width, display_height))

print('QUIT')
pygame.quit()

更新: 我被告知每次迭代都更新显示尺寸会使这对性能进行不公平的测试。这就是为什么我更新了下面的代码。此代码将窗口大小初始化为 2000x2000,并不断将其更新为空白屏幕。但是,这仍然只能达到 6 FPS,甚至什么都没有。这是为什么呢?

import pygame, time
pygame.init()

display_width = 2000
display_height = 2000
win = pygame.display.set_mode((display_width, display_height))
clock = pygame.time.Clock()

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    win.fill((0, 0, 0)) #fills over pre-existing elements

    pygame.display.update()
    clock.tick()
    print(clock.get_fps())


print('QUIT')
pygame.quit()

【问题讨论】:

  • 我分析了这段代码,65% 的时间都在pygame.display.set_mode((display_width, display_height)),所以这真的不是一个公平的基准。您是否在真实代码中的每一帧都将模式重置为相同的值?
  • 您的实际游戏代码是什么样的?此代码片段没有提供足够的上下文来说明您的问题可能出在哪里。此代码只是增加显示尺寸并重新启动它的无限循环。这是导致问题的代码吗?如果是这样,您在此代码背后的意图是什么 - 它不是您在实践中想要的设计模式。
  • 感谢您指出每次调整窗口大小对测试来说效率低下。我已经更新了上面的代码来解决这个问题。但是,在固定窗口大小的情况下,性能仍然很慢。
  • 这是在什么类型的系统上运行的?特别是 CPU、RAM、GPU 和 VRAM。
  • 我已经用顶部列出的硬件更新了我的问题。

标签: python python-3.x pygame pygame-clock


【解决方案1】:

pygame.display.set_mode 是一个相对昂贵的操作,您似乎在循环的每一次迭代中都这样做。

你可以先用屏幕修改代码做一个函数来修复它,所以...

def increase_screen():
    display_width += 1
    display_height += 1
    win = pygame.display.set_mode((display_width, display_height))

然后,您可以将其绑定到一个计时器,使其仅每秒执行一次:

# Somewhere earlier in the code
ticks = 0

# Somewhere later in the update part of the loop
ticks += 1

if ticks == 1000:
    increase_screen()
    ticks = 0

这应该会降低其运行速度,从而解决滞后问题。

【讨论】:

  • 我应该更清楚。目标不是不断增加屏幕尺寸。我只是用它作为基准来测试每个窗口维度的 FPS。但是,当我将窗口大小设置为固定的 2000x2000 时,它只能以 6 FPS 运行。我已经更新了上面有这个问题的代码。
  • 您的新代码似乎在我的笔记本电脑上以 37 FPS 的速度运行。您确定这不是您的计算机性能问题吗?
  • 我在配备 4.2GHz i7、40 GB DDR4 RAM、Radeon Pro 580 8192 MB 的 iMac 上运行它。不是一台慢速计算机,但它以 1.6 FPS 的速度运行,甚至比我的 MacBook Pro 大约 6 FPS 的速度还要慢。
猜你喜欢
  • 1970-01-01
  • 2013-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多