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

如何解决如何减少 pygame 中的延迟和 CPU 使用率? pytmx用于加载地图

我在游戏中遇到了大量延迟的问题。我的游戏有一张很大的地图。地图是 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) 

    # [...]

此解决方案提高了性能。但是,您需要支付内存使用费。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?