2015-08-07 5 views
1

Ниже приведена программа с использованием 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() 
+0

Вы получаете ошибки трассировки? – awbemauler

+1

Я не вижу ничего плохого с первого взгляда, но строка '[pygame.draw.rect (background, BAR_COLOR, b, 5) для b в барах] должна, вероятно, быть изменена. Вы не должны использовать представления списков как более короткие для циклов для выполнения методов, которые имеют побочные эффекты; не только это странно, но и немного трудно читать, он создает новый список каждый цикл, а затем сразу же отбрасывает его. Это заставляет сборщик мусора работать намного сложнее, чем нужно. Замораживание может заключаться в том, что у вас заканчивается память, а GC наступает, чтобы очистить; с тех пор вы больше не будете галочать часы (так что ОС думает, что вы застыли). –

+1

Вы также создаете кучу новых баров каждого кадра (и списка), который затем выбрасываете, вызывая аналогичную проблему. Вы можете решить свою проблему, если вы полностью перейдете к пониманию списков и просто сбрасываете эти два в нормальный цикл для диапазона. Еще одна вещь, которая может помочь, заключается в том, чтобы хранить «бары», но перемещая ее за пределы цикла и просто заменяя «bars [idx]» каждый кадр, поскольку только один бар (тот, который сопоставляет «buckets [idx]», меняет каждый кадр. –

ответ

1

Я хочу извиниться за то, что вы все время проводите. Как оказалось, с кодом не возникает проблем. Моя рабочая машина была просто перегружена различными процессами. Он запускает многопоточный тест и виртуальную машину (которая в настоящее время компилирует очень большую базу кода). Все это объясняет, почему моя программа замерзала. Спасибо, DJMcMayhem за то, что вы попробовали код. Специальный крик Алекса Ван Лей. Благодаря вам я узнал несколько новых вещей о pygame сегодня.

+1

Мне всегда нравился любознательный ум :) – stian

Смежные вопросы