2012-07-02 81 views
1

使用PyGame,我得到了閃爍的東西。盒子,圈子,文字,都閃爍。我可以通過增加我的循環之間的等待來減少這種情況,但是我也許可以通過一次性繪製所有內容來消除它,而不是單獨做所有事情。以下是我發生的一個簡單示例:一次更新全部顯示PyGame

 
    import pygame, time 
    pygame.init() 
    screen = pygame.display.set_mode((400, 300)) 
    loop = "yes" 
    while loop=="yes": 
     screen.fill((0, 0, 0), (0, 0, 400, 300)) 
     font = pygame.font.SysFont("calibri",40) 
     text = font.render("TextA", True,(255,255,255)) 
     screen.blit(text,(0,0)) 
     pygame.display.update() 

     font = pygame.font.SysFont("calibri",20) 
     text = font.render("Begin", True,(255,255,255)) 
     screen.blit(text,(50,50)) 
     pygame.display.update() 
     time.sleep(0.1) 

「開始」按鈕爲我閃爍。它可能只是我較慢的電腦,但有沒有辦法減少或消除閃爍?在我正在做的更復雜的事情中,它變得非常糟糕。謝謝!

回答

1

我認爲問題的一部分是你多次調用'pygame.display.update()'。嘗試在主循環中只調用一次。

其他一些優化:

  • 你可以把字體創建碼開出主循環的加快速度
  • loop = True而不是loop = "yes"
  • 有更加一致的FPS,你可以使用pygame的的clock

所以......

import pygame 
pygame.init() 

screen = pygame.display.set_mode((400, 300)) 
loop = True 

# No need to re-make these again each loop. 
font1 = pygame.font.SysFont("calibri",40) 
font2 = pygame.font.SysFont("calibri",20) 

fps = 30 
clock = pygame.time.Clock() 

while loop: 
    screen.fill((0, 0, 0), (0, 0, 400, 300)) 

    text = font1.render("TextA", True,(255,255,255)) 
    screen.blit(text,(0,0)) 

    text = font2.render("Begin", True,(255,255,255)) 
    screen.blit(text,(50,50)) 

    pygame.display.update() # Call this only once per loop 
    clock.tick(fps)  # forces the program to run at 30 fps. 
2

您正在循環更新屏幕2次,其中一個用於繪製第一個文本(TextA),另一個用於第二個文本(Begin)。

第一次更新後,只顯示第一個文本,因此在第一次更新和第二次更新之間看不到begin文本。這會導致閃爍。

繪製所有內容後更新您的屏幕。在你的情況下,請先刪除pygame.display.update()

1

Pygame的具有緩衝系統,以避免閃爍,所以你應該在年底吸引他們,你是幹什麼的,但只更新一次:

... 
while loop=="yes": 
    screen.fill((0, 0, 0), (0, 0, 400, 300)) 
    font = pygame.font.SysFont("calibri",40) 
    text = font.render("TextA", True,(255,255,255)) 
    screen.blit(text,(0,0)) 

    font = pygame.font.SysFont("calibri",20) 
    text = font.render("Begin", True,(255,255,255)) 
    screen.blit(text,(50,50)) 

    pygame.display.update() # only one update 

    time.sleep(0.1) 

而且Pygame的有​​比一次好。睡覺(0.1),如果你不想保持幀率。

2

您每0.1秒重新繪製整個屏幕的內容。跟蹤您實際做出的更改並更新實際包含更改內容的rects更爲常見且速度更快。因此,在循環之外繪製所有內容,讓事件修改屏幕並跟蹤實際發生變化的矩形。

因此,像這樣:

import pygame, time 
pygame.init() 
screen = pygame.display.set_mode((400, 300)) 
screen.fill((0, 0, 0), (0, 0, 400, 300)) 
font = pygame.font.SysFont("calibri",40) 
text = font.render("TextA", True,(255,255,255)) 
screen.blit(text,(0,0)) 
font = pygame.font.SysFont("calibri",20) 
text = font.render("Begin", True,(255,255,255)) 
screen.blit(text,(50,50)) 
loop = "yes" 
counter = 0 
dirty_rects = [] 
while loop=="yes": 
    pygame.display.update() 
    time.sleep(0.1) 
    # Handle events, checks for changes, etc. Call appropriate functions like: 
    counter += 1 
    if counter == 50: 
     font = pygame.font.SysFont("calibri",20) 
     text = font.render("We hit 50!", True,(255,255,255)) 
     screen.blit(text,(50,100)) 
     dirty_rects.append(Rect((50,100),text.get_size()))