问题描述
我在游戏中遇到了大量延迟的问题。我的游戏有一张很大的地图。地图是 250x250 的图块。每个图块是 32x32。请注意,我使用的是较旧的笔记本电脑。当我打开任务管理器时,它说我的 cpu 使用率高达 50%,但内存使用率只有 30-40 MB。我是初学者,所以我很感激任何帮助。 我正在使用从一些 YouTube 教程中获得的代码。我做了一些修改以使其适用于我的项目。
import pygame as pg,time,random
from pygame.locals import *
from pytmx.util_pygame import load_pygame
def blit_all_tiles(screen,tmxdata,world_offset):
for layer in tmxdata:
for tile in layer.tiles():
# tile[0] = x coordinate
# tile[1] = y coordinate
# tile[2] = image data
x_pixel = tile[0] * 32 + world_offset[0]
y_pixel = tile[1] * 32 + world_offset[1]
screen.blit(tile[2],(x_pixel,y_pixel))
# Game Variables
def main():
tmxdata = load_pygame("assets/Chris' adventure.tmx")
# Standing
player_stand = pg.image.load("Charassets/Cris 01.png")
player_stand = pg.transform.scale(player_stand,(32,32))
# Moving Right
player_left = [
pg.image.load("Charassets/Cris 04.png"),pg.image.load("Charassets/Cris 05.png"),pg.image.load("Charassets/Cris 06.png"),]
player_up = [
pg.image.load("Charassets/Cris 07.png"),pg.image.load("Charassets/Cris 08.png"),pg.image.load("Charassets/Cris 09.png"),]
player_down = [
pg.image.load("Charassets/Cris 01.png"),pg.image.load("Charassets/Cris 02.png"),pg.image.load("Charassets/Cris 03.png"),]
# Resize
player_left = [pg.transform.scale(image,32)) for image in player_left]
player_left_f = 0
player_up = [pg.transform.scale(image,32)) for image in player_up]
player_up_f = 0
player_down = [pg.transform.scale(image,32)) for image in player_down]
player_down_f = 0
# Flipping
player_right = [pg.transform.flip(image,True,False) for image in player_left]
player_right_f = 0
direction = "stand"
world_offset = [0,0]
quit = False
x = 400
y = 200 + 128
# Game Loop
while not quit:
screen.fill((0,0))
blit_all_tiles(screen,world_offset)
# Events
keypressed = pg.key.get_pressed()
for event in pg.event.get():
# print(event)
if event.type == QUIT:
quit = True
if keypressed[ord("a")]:
x = x - 20
world_offset[0] += 40
direction = "left"
if sum(keypressed) == 0:
direction = "stand"
if keypressed[ord("d")]:
x = x + 20
world_offset[0] -= 40
direction = "right"
if keypressed[ord("w")]:
y = y - 20
world_offset[1] += 40
direction = "up"
if keypressed[ord("s")]:
y = y + 20
world_offset[1] -= 40
direction = "down"
if y < 204:
y = 204
if y >= screen.get_height() - 204 - 32:
y = screen.get_height() - 204 - 32
if x < 204:
x = 204
# world_offset[0] += 10
if x >= screen.get_width() - 204 - 32:
x = screen.get_width() - 204 - 32
# Game Logic
# player = Rect(x,y,32,32)
# pg.draw.rect(screen,(225,120),player)
if direction == "stand":
screen.blit(player_stand,(x,y))
elif direction == "left":
screen.blit(player_left[player_left_f],y))
player_left_f = (player_left_f + 1) % len(player_left)
elif direction == "right":
screen.blit(player_right[player_right_f],y))
player_right_f = (player_right_f + 1) % len(player_right)
elif direction == "up":
screen.blit(player_up[player_up_f],y))
player_up_f = (player_up_f + 1) % len(player_up)
elif direction == "down":
screen.blit(player_down[player_down_f],y))
player_down_f = (player_down_f + 1) % len(player_down)
# Screen Update
pg.display.update()
clock.tick(60)
# Game Initialization
if __name__ == "__main__":
width,height = 800,600
pg.init()
pg.mixer.init()
screen = pg.display.set_mode((width,height))
pg.display.set_caption("Chris' quest")
clock = pg.time.Clock()
main()
pg.quit()
我成功导入了地图,现在可以使用,但延迟非常严重。我很困惑,我不知道如何解决这个问题。我将不胜感激。提前致谢。
解决方法
确保图像Surface与显示Surface具有相同的格式。使用 convert()
(或 convert_alpha()
)创建具有相同像素格式的 Surface。当图像在显示器上显示 blit
时,这会提高性能,因为格式是兼容的,并且 blit
不需要执行隐式转换。
例如:
player_stand = pg.image.load("CharAssets/Cris 01.png")
player_stand = pg.image.load("CharAssets/Cris 01.png").convert_alpha()
另一种选择是创建游戏的单个大地图。
通过在其上绘制所有图块来创建一个 pygame.Surface
大小的整个地图:
def create_map():
game_map = pygame.Surface((250 * 32,250 * 32))
for layer in tmxdata:
for tile in layer.tiles():
# tile[0] = x coordinate
# tile[1] = y coordinate
# tile[2] = image data
x_pixel = tile[0] * 32
y_pixel = tile[1] * 32
game_map.blit(tile[2],(x_pixel,y_pixel))
return game_map
game_map = create_map()
在应用程序中,您只在屏幕上绘制地图的一部分,使用 blit
方法的可选 area 参数:
while not quit:
# [...]
sub_area = screen.get_rect(topleft = world_offset)
screen.blit(game_map,(0,0),sub_area)
# [...]
此解决方案提高了性能。但是,您需要支付内存使用费。