2015-12-16 71 views
1

我正在嘗試製作基於平鋪的遊戲,之前沒做過這樣的事情,所以我正在學習,因爲我一直在前進。不過,我遇到了一個速度很大的問題,我想知道是否有人有任何解決方案/建議。我嘗試將重新計算的位和實際的圖形分開,但由於您目前只能移動相機,因此它必須一次執行兩次,而且如果您的圖塊尺寸較小且分辨率較高,則運行速度非常明顯。有了Pygame,有沒有更快的方法來繪製數百個小方格?

我認爲一個想法是將其拆分成塊,所以你計算一個x * x區域,而不是檢查每個瓷磚,如果它在屏幕邊界內,你只檢查瓷磚組,然後以某種方式緩存它這是第一次繪製,所以你最終會從內存中繪製出單個圖像。但是,當我使用Google搜索時,沒有發現任何內容。

至於拉拔部分,它運行到的效果:

for tile in tile_dict: 
    pygame.draw.rect(precalculated stuff) 

在相同tilesize如在下圖中,以720p它在運行100FPS,並且在1080在它運行75fps。這與字面上沒有任何東西,但繪製正方形。每個塊的顏色都略有不同,所以我不能畫出更大的方塊。順便說一句,我不知道重畫每一幀。

至於重新計算部分,它有點長,但仍然很容易理解。我計算哪些座標位於屏幕的邊緣,並使用它來構建所有屏幕拼貼的列表。然後刪除區域外的任何區塊,如果區塊在屏幕上移動,則將區域移動到新位置,然後計算剛剛出現的區塊。這個速度在720p下可以達到90fps,在1080p下可以達到45fps,這真的不好。

def recalculate(self): 
    overflow = 2 
    x_min = self.cam.x_int + 1 - overflow 
    y_min = self.cam.y_int + 1 - overflow 
    x_max = self.cam.x_int + int(self.WIDTH/self.tilesize) + overflow 
    y_max = self.cam.y_int + int(self.HEIGHT/self.tilesize) + overflow 


    self.screen_coordinates = [(x, y) 
           for x in range(x_min, x_max) 
           for y in range(y_min, y_max)] 


    #Delete the keys that have gone off screen 
    del_keys = [] 
    for key in self.screen_block_data: 
     if not x_min < key[0] < x_max or not y_min < key[1] < y_max: 
      del_keys.append(key) 
    for key in del_keys: 
     del self.screen_block_data[key] 


    #Rebuild the new list of blocks 
    block_data_copy = self.screen_block_data.copy() 
    for coordinate in self.screen_coordinates: 

     tile_origin = ((coordinate[0] - self.cam.x_int) - self.cam.x_float, 
         (coordinate[1] - self.cam.y_int) - self.cam.y_float) 
     tile_location = tuple(i * self.tilesize for i in tile_origin) 

     #Update existing point with new location 
     if coordinate in self.screen_block_data: 
      self.screen_block_data[coordinate][2] = tile_location 
      continue 

     block_type = get_tile(coordinate) 

     #Generate new point info 
     block_hash = quick_hash(*coordinate, offset=self.noise_level) 

     #Get colour 
     if coordinate in self.game_data.BLOCK_TAG: 
      main_colour = CYAN #in the future, mix this with the main colour 
     else: 
      main_colour = TILECOLOURS[block_type] 
     block_colour = [min(255, max(0, c + block_hash)) for c in main_colour] 
     self.screen_block_data[coordinate] = [block_type, 
               block_colour, 
               tile_location] 

我實現了我上面寫的,我大概可以緩存爲10×10區域或某事的信息以減少需要移動相機時需要做什麼,但仍然無法繞得繪圖問題。

我可以上傳完整的代碼,如果有人想嘗試與它的東西(它分裂了幾個文件,所以可能更容易不粘貼一切在這裏),但這裏是一個截圖,看它如何看起來有點參考:

enter image description here

+0

「......所以我不能畫一個更大的廣場。」但這正是你所做的。將較小的方塊繪製成一個更大的正方形,然後blit。 –

+0

那麼你的意思是將實際的圖像文件從小方塊渲染到內存中?我現在不能檢查,因爲我在我的手機上,但你會碰巧知道這樣做的功能嗎? – Peter

回答

0

爲了提高繪圖的小方塊的速度,可以吸引他們到非屏表面(任何pygame的表面,這將是大到足以容納所有的方塊),然後在的blit這個表面屏幕顯示正確的座標。 這樣您就不需要檢查屏幕外是否有任何方塊,只需要提供倒置的相機(視點)座標(如果相機的位置是[50,20],那麼您應該使用方塊將表面上的方塊[-50,-20])。

相關問題