当前位置: 首页 > 知识库问答 >
问题:

PyGame程序滞后与多个精灵(〜170)

谭正谊
2023-03-14

首先,我已经事先研究了stackoverflow这个主题,但是我想了解更多关于它的信息,所以我要问一个新问题。

所以基本上,我一直在PyGame1.9中工作。我已经成功地制作了一个简单的2D图形游戏。我使用的是Sprite类,因此我经常使用Group()方法。我使用groupName在屏幕上绘制图形。绘制(屏幕)。

我的游戏的一个组成部分是与地形互动的能力,例如移除瓷砖和放置瓷砖。每个磁贴都是绘制到屏幕上的我的块雪碧组的一部分。

然而,我的程序开始明显滞后,因为块瓷砖的数量增加。以下是我为解决这个问题所做的努力:

  • 用过。为我加载的所有图像转换_alpha()
  • 仅加载一次图像
  • 更改目标FPS(使用60 atm)
  • 更改我的程序,使区块组。draw()命令仅在环境更改时调用。基本上,如果环境发生变化,我会重新绘制块,截图我的窗口,然后blit这个图像,直到环境再次发生变化(正如预期的那样,这会导致截图时的延迟)

然而,我的游戏继续落后。

自然,如果我增加我的块精灵的大小(这意味着我如何调整他们加载各自的图像时),我可以最终放置更多的块没有滞后发生,直到后来,因为有较少的精灵总数,但这不是我想要的理想完成。

此外,我还实施了两个NPC团队,他们与该地形交互。因此,我的程序需要检查主游戏循环中的大量冲突是可以理解的,但尽管如此,我并不期望我的程序会滞后,除非我加入一个约30个NPC的团队(我目前只与10个NPC合作,每个团队5个NPC)。

当我的程序开始延迟时,我计算出精灵总数(将每组中的所有精灵相加)为170。

所以,最后,我的问题是:如果我计划有一个同时使用多个精灵的程序(倍数约为170),pygame在速度方面是否不适合这项工作?

我相信我已经使用了很好的实现实践,比如在删除sprite之后从它们各自的组中删除它们,以及上面的简要列表。

我已经要求提供一些代码,所以这里有一些重要的部分,我已经包括在内。

主要游戏循环:

# Main Game Loop
while gameRunning:
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        gameRunning = False

    keys = pygame.key.get_pressed()
    if keys[LEFT_KEY]:
        player1.goLeft()

    if keys[RIGHT_KEY]:
        player1.goRight()

    if keys[JUMP_KEY]:
        player1.jump()

    if keys[DOWN_KEY]:
        player1.ducking = True

    if keys[SPRINT_KEY] and player1.movementKeyPressed:
        player1.startSprinting()

    if keys[SHOW_SCORES_KEY]:
        Screen.DISPLAY_SCORES = True

    # KEYUP EVENT
    elif event.type == pygame.KEYUP:
        if event.key == LEFT_KEY or event.key == RIGHT_KEY or event.key == SPRINT_KEY:
            player1.stopMovingX()
            player1.isSprinting = False

        if event.key == DOWN_KEY:
            player1.ducking = False

        if event.key == SHOW_SCORES_KEY:
            Screen.DISPLAY_SCORES = False

    # MOUSE
    if event.type == pygame.MOUSEBUTTONDOWN:
        # Left Click
        if event.button == ATTACK_KEY:
            player1.attack()

        # Right Click
        elif event.button == PLACE_BLOCK_KEY:
            player1.requestToPlaceBlock()

# Clear the screen
Screen.gameScreen.fill(Colors.WHITE)

# Update Sprites
EntityLists.npcGroup.update()
EntityLists.redTeamGroup.update()
EntityLists.blackTeamGroup.update()
EntityLists.corpseGroup.update()

# Update Blocks
EntityLists.blockGroup.update()

#
print(len(EntityLists.blockGroup) + len(EntityLists.redTeamGroup) + len(EntityLists.blackTeamGroup) +
      len(EntityLists.npcGroup) + len(EntityLists.wallGroup))

if Screen.takeScreenShot:
    # Blit background first
    Screen.gameScreen.blit(background, (0, 0))
    # Draw blocks and wall next
    EntityLists.wallGroup.draw(Screen.gameScreen)
    EntityLists.blockGroup.draw(Screen.gameScreen)

    # Next, take screenshot
    pygame.image.save(Screen.gameScreen, "BACKGROUND_AND_BLOCKS.png")
    backgroundAndBlocks = pygame.image.load('BACKGROUND_AND_BLOCKS.png')
    # Reset variable
    Screen.takeScreenShot = False

# Blit
Screen.gameScreen.blit(backgroundAndBlocks, (0, 0))

# Draw Entities
EntityLists.npcGroup.draw(Screen.gameScreen)
EntityLists.redTeamGroup.draw(Screen.gameScreen)
EntityLists.corpseGroup.draw(Screen.gameScreen)
EntityLists.blackTeamGroup.draw(Screen.gameScreen)

# Player names
Screen.drawNames()

# Draw Death Messages
Screen.displayDeathMessages()

# Draw scores if viable
if Screen.DISPLAY_SCORES:
    Screen.displayScores()

# Update screen
pygame.display.flip()

# FPS
clock.tick(Screen.TARGET_FPS)

pygame.quit()

非常感谢你的时间。

共有1个答案

夏侯阳
2023-03-14

尝试使用spritesheets,这样你只上传一个包含所有sprites的图片一次。

如果你的主角有20个不同的图像(帧),包括空闲、跑步、行走、跳跃、射击等,而你没有使用精灵表,会发生什么?

PyGame需要在每个循环中一个接一个地上传所有这些图像,从而产生延迟。

相反,spritesheet是一个单一的图像,包含所有的精灵,每个精灵都有一个(x,y,宽度,高度),所以pyplay在需要特定的精灵框架时知道每个精灵的边界。

试着使用spritesheets,它会让你的游戏运行顺畅,减少处理能力,减少图形卡的使用等,减少热量等。

100张图片,每张重100kb...那是很多,但是一张spritesheet图片只有100kb...

如果您的游戏只有5个精灵,请在没有延迟的情况下使用图像,但如果您的游戏有超过5个精灵并出现延迟,请使用精灵表,这也有助于使您的工作更有条理,当您想要打包时,请将其转换为。exe或别的什么东西,它的重量会轻一些。

注意:我不久前发布了我的答案,但我只是想补充一点,当你加载你的图像时,试着加载它们一次,在init方法中,在update方法中只引用它们。不要在循环中使用“pygame.image.load(filename)”,它会滞后。

祝你好运

 类似资料:
  • 我在PyGame中创建了两个简单的精灵,其中一个是雨伞,另一个是雨滴。雨滴被添加到一个名为< code>all_sprites的sprite组中。伞精灵有自己的组,名为< code>Umbrella_sprite 雨滴从屏幕顶部“落下”,如果其中一个碰到雨伞/与雨伞碰撞..雨滴应该被删除了。但是除了特定雨滴之外,所有其他雨滴都受此影响。

  • 我正在与Pygame一起练习,试图学习类,对象等的一些基本用法。 现在,在http://programarcadegames.com/的帮助下,我正在制作一个基本的平台 我有一个精灵播放器和精灵平台。这些平台也可以是移动平台,它应该在碰撞时移动玩家,但是当玩家移动到其他平台时,会发生一些奇怪的传送,我现在没有看到问题。 基本上,当被推时,玩家在逻辑上没有被移动(至少对我来说是这样)。 非常感谢任何

  • 对于我的pyplay塔防御计划,我试图弄清楚如何实现与地图上已经放置的其他塔的碰撞。 放置过程将创建一个48x48预览精灵,当它在游戏屏幕上时,该精灵将在玩家鼠标上的网格中移动。塔精灵保存在名为的组中。我有这段代码来检查精灵是否与某些地形瓷砖和塔精灵发生碰撞(这在精灵更新功能中): 循环前进部分是为了检查预览精灵是否与任何塔精灵矩形碰撞。如果是,它将变量设置为true或其他,False。 然后程序

  • 我一直在学习一些pygame教程,并且基于这些教程开发了自己的代码。具体如下: 所以我想出了如何让我的家伙跳跃,但是我已经在天空中放置了一个块并试图这样做: 试图让角色停止跳跃。有没有一个内置的函数来测试这一点,或者有没有一个适合我的方法。顺便说一下,这是行不通的,我似乎也不知道该怎么做。非常感谢任何帮助:)

  • 我正在PyGame中制作一个太空入侵者游戏,但当我尝试绘制投射物时,它会覆盖/更改主精灵(平面)。如何解决此问题,以便在屏幕上显示多个精灵?

  • 我正在用Python pygame制作一个游戏,并制作了一个移动的背景,一个作为玩家的跳跃精灵和生成障碍物。现在我正在研究玩家和障碍物之间的碰撞,并编写了一些代码,但最终出现了错误: 我不知道,为什么那个类不是精灵,也不知道如何把它变成精灵。我希望修复这个错误后,碰撞工程。 播放器图像1 图像 2 背景图片3