我正在嘗試製作基於平鋪的遊戲,之前沒做過這樣的事情,所以我正在學習,因爲我一直在前進。不過,我遇到了一個速度很大的問題,我想知道是否有人有任何解決方案/建議。我嘗試將重新計算的位和實際的圖形分開,但由於您目前只能移動相機,因此它必須一次執行兩次,而且如果您的圖塊尺寸較小且分辨率較高,則運行速度非常明顯。有了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區域或某事的信息以減少需要移動相機時需要做什麼,但仍然無法繞得繪圖問題。
我可以上傳完整的代碼,如果有人想嘗試與它的東西(它分裂了幾個文件,所以可能更容易不粘貼一切在這裏),但這裏是一個截圖,看它如何看起來有點參考:
「......所以我不能畫一個更大的廣場。」但這正是你所做的。將較小的方塊繪製成一個更大的正方形,然後blit。 –
那麼你的意思是將實際的圖像文件從小方塊渲染到內存中?我現在不能檢查,因爲我在我的手機上,但你會碰巧知道這樣做的功能嗎? – Peter