Ниже приведена программа с использованием 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
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()
EDIT
Это очень хорошие предложения. Я изменил свой код, чтобы следовать им, однако код все еще зависает. Вот как выглядит код:
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()
Вы получаете ошибки трассировки? – awbemauler
Я не вижу ничего плохого с первого взгляда, но строка '[pygame.draw.rect (background, BAR_COLOR, b, 5) для b в барах] должна, вероятно, быть изменена. Вы не должны использовать представления списков как более короткие для циклов для выполнения методов, которые имеют побочные эффекты; не только это странно, но и немного трудно читать, он создает новый список каждый цикл, а затем сразу же отбрасывает его. Это заставляет сборщик мусора работать намного сложнее, чем нужно. Замораживание может заключаться в том, что у вас заканчивается память, а GC наступает, чтобы очистить; с тех пор вы больше не будете галочать часы (так что ОС думает, что вы застыли). –
Вы также создаете кучу новых баров каждого кадра (и списка), который затем выбрасываете, вызывая аналогичную проблему. Вы можете решить свою проблему, если вы полностью перейдете к пониманию списков и просто сбрасываете эти два в нормальный цикл для диапазона. Еще одна вещь, которая может помочь, заключается в том, чтобы хранить «бары», но перемещая ее за пределы цикла и просто заменяя «bars [idx]» каждый кадр, поскольку только один бар (тот, который сопоставляет «buckets [idx]», меняет каждый кадр. –