Python 为什么这个pygame程序会冻结?
下面是一个使用Python 为什么这个pygame程序会冻结?,python,pygame,Python,Pygame,下面是一个使用pygame的程序,它会随着值的变化更新直方图 但是,运行几秒钟后,程序冻结。有人能指出错误吗 import random import pygame SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600 FRAME_RATE = 50 BACKGROUND_COLOR = pygame.Color("white") BAR_COLOR = pygame.Color("Black") BUCKET_CNT = 20 pygam
pygame
的程序,它会随着值的变化更新直方图
但是,运行几秒钟后,程序冻结。有人能指出错误吗
import random
import pygame
SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
FRAME_RATE = 50
BACKGROUND_COLOR = pygame.Color("white")
BAR_COLOR = pygame.Color("Black")
BUCKET_CNT = 20
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
screen.fill(BACKGROUND_COLOR)
buckets = BUCKET_CNT*[0]
bar_w = SCREEN_WIDTH / BUCKET_CNT
clock = pygame.time.Clock()
background = pygame.Surface(screen.get_size())
background.fill(BACKGROUND_COLOR)
while True:
clock.tick(FRAME_RATE)
random.seed()
idx = random.randrange(BUCKET_CNT)
buckets[idx] += 1
# Create rectangles representing bars in the histogram.
bars = [pygame.Rect(i*bar_w,
SCREEN_HEIGHT - buckets[i],
bar_w, buckets[i]) for i in range(BUCKET_CNT)]
# Draw bars on the background
[pygame.draw.rect(background, BAR_COLOR, b, 5) for b in bars]
# Blit the background
screen.blit(background, (0, 0))
# Show "stuff" on the screen
pygame.display.flip()
编辑
这些都是很好的建议。我已经更改了我的代码,用以跟踪它们,但是代码仍然冻结。下面是代码现在的样子:
import random
import pygame
SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
FRAME_RATE = 50
BACKGROUND_COLOR = pygame.Color("white")
BAR_COLOR = pygame.Color("Black")
BUCKET_CNT = 20
GROWTH_RATE = 10
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
screen.fill(BACKGROUND_COLOR)
buckets = BUCKET_CNT*[0]
bar_w = SCREEN_WIDTH / BUCKET_CNT
clock = pygame.time.Clock()
background = pygame.Surface(screen.get_size())
background.fill(BACKGROUND_COLOR)
# Create rectangles representing bars in the histogram.
bars = [pygame.Rect(i*bar_w,
SCREEN_HEIGHT - buckets[i],
bar_w, buckets[i]) for i in range(BUCKET_CNT)]
random.seed()
while True:
clock.tick(FRAME_RATE)
idx = random.randrange(BUCKET_CNT)
buckets[idx] += 1
bars[idx].inflate_ip(0, GROWTH_RATE)
# Draw bars on the background
pygame.draw.rect(background, BAR_COLOR, bars[idx])
# Blit the background
screen.blit(background, (0, 0))
# Show "stuff" on the screen
pygame.display.flip()
我想为占用大家的时间而道歉。事实证明,代码没有问题。我的工作机器只是被各种各样的进程超载了。它正在运行一个多线程测试和一个虚拟机(目前正在编译一个非常大的代码库)。这就解释了为什么我的程序冻结了。谢谢DJMcMayhem尝试了这个代码。向亚历克斯·范·莱乌发出一声特别的呼喊。多亏了你,我今天学到了一些关于pygame的新东西。你有没有发现任何回溯错误?我一眼就看不出任何错误,但线条
[pygame.draw.rect(背景,条形图颜色,b,5)对于条形图中的b]
可能应该更改。您不应该使用列表理解作为循环执行有副作用的方法的缩写;它不仅奇怪而且有点难读,它会在每个循环中创建一个新的列表,然后立即将其丢弃。这使得垃圾收集器的工作比它需要的要困难得多。冻结可能是内存耗尽,GC介入清理;从那时起,你就不再按部就班了(所以操作系统认为你被冻结了)。你还在每一帧(和一个列表)上创建了一堆新的条,然后你就把它们扔掉了,导致了类似的问题。如果您完全放弃列表理解,将这两种理解折叠成一个范围内的正常for循环,您可能会解决您的问题。另一件可能有用的事情是保持条
,但将其移出循环,只需更换条[idx]
每一帧,因为只有一条条(映射到桶[idx]
的条)会更改每一帧。如果您想更高效,那么Rect
类有一些可以使用的条(特别是移动ip()
和充气ip()
)这将允许您调整矩形的大小,而不是创建新的矩形。无论哪种方式,屏幕冻结的症状都是由时钟没有在每一帧上滴答作响引起的,因此循环中有一些东西导致时钟没有滴答作响。您应该更好地分析正在发生的情况。观察内存、调试、日志消息。。.