2016-03-12 57 views
1

所以我有一個基於瓷磚的遊戲是216X384單位大。 cell_array中的每個正方形都是草地,我預先裝入了convert_alpha()。每次繪製時(我的fps都是30),它在cell_array中循環並將其傳送到屏幕上。如果cell_array爲空,則需要大約0.02秒來完成此操作以及其他操作,因此30 fps工作得很好。但是當它充滿草時,需要0.08-0.1秒,使其滯後很多。任何提示,技巧或想法可以幫到您?Pygame blitting很多圖片滯後遊戲

以下是cell_array代碼的樣子。

cell_array = [] 

width_of_cells = 10 
height_of_cells = 10 
cell_Rows = 216 
cell_Cols = 384 

def initialize_empty_cell_board(rows, cols): 
    for x in range(cell_Cols): 
     new = [] 
     for y in range(cell_Rows): 
      new.append(["NULL", False, True]) 

     cell_array.append(new) 

def add_tile(board, tile, cx, cy): 
    for i in range(tile.c_width): 
     for q in range(tile.c_height): 
      if cx+i < cell_Cols and cy+i < cell_Rows: 
       board[cx+i][cy+i] = [tile, False, tile.is_passible] 
    board[cx][cy] = [tile, True, tile.is_passible] 

initialize_empty_cell_board(cell_Rows, cell_Cols) 

這裏是塊傳輸代碼:

cx = -1 
    cy = -1 
    for x in cell_array: 
     cy = -1 
     cx += 1 
     for y in x: 
      cy += 1 
      if y[0] != "NULL" and y[1] == True: 
       screen.blit(y[0].img.name, (cx*cells.width_of_cells, cy*cells.height_of_cells)) 

這裏是圖像代碼如下所示:

class Image(object): 

    def __init__(self, src): 
     self.name = pygame.image.load(src).convert_alpha() 
+0

最好的選擇可能是使用convert()而不是convert_alpha()。這應該已經大大提高你的傳輸速度。 – xXliolauXx

+0

@xXliolauXx當它爲空時,它只是字符,它有幫助。但阿爾法變成了一個醜陋的黑色,並且由於草沒有阿爾法,它只會讓它運行在0.07秒而不是0.08秒,幾乎不足以證明它的醜陋。好主意,但! – Demandooda

+0

好吧,它不會比Windows機器上的好得多(在沒有硬件加速的情況下,pygame在Windows上似乎不會超過20FPS左右)。如果fps在你的遊戲中非常關鍵,你可能想看看PyGame支持的PyOpenGL。如果你想要的話,你可以給我發送你的源代碼,我會讓它在我的Linux機器上運行,這似乎可以通過pygame獲得體面的最大FPS。如果它比你的運行速度快,那就是典型的pygame-fps-issue-thingie。 – xXliolauXx

回答

0

這將是很容易處理,如果比賽沒有必須在每一幀都將它們塗抹。我假設這塊草地磚是地板或背景。這意味着所有的草地都可以預先鋪設到一個表面上,並且每個框架只需要鋪設表面。

這個例子:

import pygame as py 

py.init() 

window = (400,400) 
screen = py.display.set_mode(window) 

font = py.font.Font(None,36) 

clock = py.time.Clock() 

def draw_onto_screen(): 
    for i in xrange(0,200): 
     for j in xrange(0,200): 
      py.draw.rect(screen,(0,255,0),(i,j,5,5)) 
    text = font.render(str(clock.get_fps()),1,(10,10,10)) 
    screen.blit(text,(0,0)) 

done = False 
while not done: 
    for event in py.event.get(): 
     if event.type == py.QUIT: 
      done = True 
    draw_onto_screen() 
    py.display.flip() 
    clock.tick(60) 

py.quit() 

繪製40000個平方的每一幀,並遭受了它在我的機器上顯示的11fps平均(你可以自己運行一下,看看FPS左上角)。

然而,如果我們繪製所有方塊到另一面第一個(可以稱之爲背景)和簡單的blit是表面,我們得到:

import pygame as py 

py.init() 

window = (400,400) 
screen = py.display.set_mode(window) 

font = py.font.Font(None,36) 

clock = py.time.Clock() 

def draw_onto_screen(): 
    for i in xrange(0,200): 
     for j in xrange(0,200): 
      py.draw.rect(background,(0,255,0),(i,j,5,5)) 

background = py.Surface(window) 
draw_onto_screen() #### only called once 

done = False 
while not done: 
    for event in py.event.get(): 
     if event.type == py.QUIT: 
      done = True 
    screen.blit(background,(0,0)) #### blit the background onto screen 
    text = font.render(str(clock.get_fps()),1,(10,10,10)) 
    screen.blit(text,(0,0)) 
    py.display.flip() 
    clock.tick(60) 

py.quit() 

其中提請完全相同的內容,但是巡航速度62.5fps 。現在當你想移動背景時,你只需將它拍到不同的位置(目前(0,0))

希望這有助於。