python - Python Pygame 超慢,窗口大小增加
问题描述
硬件:配备 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()
解决方案
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
这应该会降低其运行速度,从而解决滞后问题。
推荐阅读
- python - Python Kivy:我可以在屏幕之间切换时以降低状态打开BackDrop吗
- java - 注入包装类时未完成的存根异常
- javaparser - Java Parser 注释语句
- python - 是否有一个内置的 Python 函数可以根据给定条件替换特定列表位置中的值?
- linux - SCTP 端口未打开以接收来自 kubernetes 集群外部的流量
- react-native - 如何使用 react-native-sqlite-storage 在 react-native 中存储和更新图像
- laravel - PrivateChannel Laravel 推送器
- javascript - 在我的反应应用程序中获取 net::ERR_ABORTED 401
- batch-file - 用于每天检查存档路径中是否存在随机文件的 Batscript,并应在最后 30 分钟内检查文件是否已处理
- jmeter - 在 JMeter 中录制时无法上传文件