Python 如何减少pygame中的延迟和CPU使用?(pytmx用于加载地图)

Python 如何减少pygame中的延迟和CPU使用?(pytmx用于加载地图),python,pygame,pytmx,Python,Pygame,Pytmx,我在比赛中有一个很大的滞后问题。我的游戏有一张很大的地图。这张地图是250x250。每块瓷砖为32x32。请注意,我使用的是旧的笔记本电脑。当我打开任务管理器时,它说我的CPU使用率高达50%,但内存使用率只有30-40MB。我是一个初学者,所以我将感谢任何帮助。 我正在使用从YouTube教程中获得的代码。为了配合我的项目,我做了一些修改 import pygame as pg, time, random from pygame.locals import * from

我在比赛中有一个很大的滞后问题。我的游戏有一张很大的地图。这张地图是250x250。每块瓷砖为32x32。请注意,我使用的是旧的笔记本电脑。当我打开任务管理器时,它说我的CPU使用率高达50%,但内存使用率只有30-40MB。我是一个初学者,所以我将感谢任何帮助。 我正在使用从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, 32)) for image in player_left]
player_left_f = 0
player_up = [pg.transform.scale(image, (32, 32)) for image in player_up]
player_up_f = 0
player_down = [pg.transform.scale(image, (32, 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, 0))
    blit_all_tiles(screen, tmxdata, 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, 0, 120), player)
    if direction == "stand":
        screen.blit(player_stand, (x, y))
    elif direction == "left":
        screen.blit(player_left[player_left_f], (x, y))
        player_left_f = (player_left_f + 1) % len(player_left)
    elif direction == "right":
        screen.blit(player_right[player_right_f], (x, y))
        player_right_f = (player_right_f + 1) % len(player_right)
    elif direction == "up":
        screen.blit(player_up[player_up_f], (x, y))
        player_up_f = (player_up_f + 1) % len(player_up)
    elif direction == "down":
        screen.blit(player_down[player_down_f], (x, 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()
将pygame导入为pg、时间、随机
从pygame.locals导入*
从pytmx.util_pygame导入加载_pygame
def blit_所有分幅(屏幕、tmxdata、世界偏移):
对于tmxdata中的层:
对于层中的平铺。平铺():
#平铺[0]=x坐标
#平铺[1]=y坐标
#平铺[2]=图像数据
x_像素=平铺[0]*32+世界_偏移[0]
y_像素=平铺[1]*32+世界_偏移[1]
blit(平铺[2],(x_像素,y_像素))
#博弈变量
def main():
tmxdata=load_pygame(“assets/Chris'aventure.tmx”)
#站立
player_stand=pg.image.load(“CharAssets/Cris 01.png”)
玩家站=pg.transform.scale(玩家站,(32,32))
#向右移动
玩家左=[
pg.image.load(“CharAssets/Cris 04.png”),
pg.image.load(“CharAssets/Cris 05.png”),
pg.image.load(“CharAssets/Cris 06.png”),
]
玩家向上=[
pg.image.load(“CharAssets/Cris 07.png”),
pg.image.load(“CharAssets/Cris 08.png”),
pg.image.load(“CharAssets/Cris 09.png”),
]
玩家_向下=[
pg.image.load(“CharAssets/Cris 01.png”),
pg.image.load(“CharAssets/Cris 02.png”),
pg.image.load(“CharAssets/Cris 03.png”),
]
#调整大小
player_left=[pg.transform.scale(图像,(32,32))用于player_left中的图像]
玩家左\u f=0
player_up=[pg.transform.scale(图像,(32,32))用于player_up中的图像]
游戏者_up _f=0
player_down=[pg.transform.scale(图像,(32,32))用于player_down中的图像]
玩家_向下_f=0
#翻转
player_right=[pg.transform.flip(图像,真,假)用于player_left中的图像]
玩家\u右\u f=0
方向=“站立”
世界单位偏移量=[0,0]
退出=错误
x=400
y=200+128
#游戏循环
不退出时:
屏幕填充((0,0,0))
blit_all_磁贴(屏幕、tmxdata、世界偏移)
#事件
keyppressed=pg.key.get_pressed()
对于pg.event.get()中的事件:
#打印(事件)
如果event.type==退出:
退出=真
如果按下[ord(“a”)]键:
x=x-20
世界单位偏移量[0]+=40
方向=“左”
如果总和(按键)==0:
方向=“站立”
如果按下[ord(“d”)]键:
x=x+20
世界单位偏移量[0]=40
direction=“right”
如果按下[ord(“w”)]键:
y=y-20
世界单位偏移量[1]+=40
方向=“向上”
如果按下[ord(“s”)]键:
y=y+20
世界单位偏移量[1]=40
方向=“向下”
如果y<204:
y=204
如果y>=屏幕。获取高度()-204-32:
y=screen.get_height()-204-32
如果x<204:
x=204
#世界_偏移量[0]+=10
如果x>=screen.get_width()-204-32:
x=屏幕。获取宽度()-204-32
#博弈逻辑
#player=Rect(x,y,32,32)
#pg.draw.rect(屏幕,(225,0,120),播放器)
如果方向==“站立”:
屏幕。blit(玩家站,(x,y))
elif方向==“左”:
blit(player_left[player_left_f],(x,y))
玩家左f=(玩家左f+1)%len(玩家左)
elif方向==“右”:
blit(player_right[player_right_f],(x,y))
玩家右f=(玩家右f+1)%len(玩家右)
elif方向==“向上”:
blit(player\u up[player\u up\u f],(x,y))
玩家上浮=玩家上浮+1)%len(玩家上浮)
elif方向==“向下”:
blit(player_down[player_down_f],(x,y))
玩家倒下(玩家倒下+1)%len(玩家倒下)
#屏幕更新
pg.display.update()
时钟滴答(60)
#游戏初始化
如果名称=“\uuuuu main\uuuuuuuu”:
宽度,高度=800600
第init页()
pg.mixer.init()
屏幕=pg.display.set_模式((宽度、高度))
pg.display.set_标题(“克里斯的任务”)
时钟=pg.time.clock()
main()
第页退出
我成功地导入了地图,它现在可以工作了,但滞后是极端的。我很困惑,不知道如何解决这个问题。我会很感激你的帮助。提前感谢。

确保图像表面的格式与显示表面的格式相同。使用(或)创建具有相同像素格式的曲面。当图像在显示器上显示为
blit
时,这将提高性能,因为格式兼容且
blit
不需要执行隐式转换

例如:

player\u stand=pg.image.load(“CharAssets/Cris 01.png”)

player_stand=pg.image.load(“CharAssets/Cris 01.png”).convert_alpha()

另一个选择是创建游戏的单个大型地图

通过在地图上绘制所有平铺,创建一个与整个地图大小相同的平铺:

def create_map():
game_map=pygame.Surface((250*32250*32))
对于tmxdata中的层:
对于层中的平铺。平铺():
#平铺[0]=x坐标
#平铺[1]=y坐标
#平铺[2]=图像数据
x_像素=平铺[0]*32
y_像素=平铺[1]*32
游戏地图.blit(平铺[2],(x_像素,y_像素))
返回游戏地图
game\u map=create\u map()
在应用程序中,使用
blit
方法的可选区域参数,仅在屏幕上绘制地图的一部分:

不退出时:
# [...]
sub_区域=屏幕。get_rect(左上角=世界偏移)
屏幕。blit(游戏地图,(0,0),子区域)
# [...]
此解决方案提高了性能