Отставание программы Pygame с несколькими спрайтами (~ 170) - PullRequest
0 голосов
/ 27 апреля 2018

Во-первых, я заранее изучил эту тему по stackoverflow, но мне хотелось бы получить больше информации об этом, поэтому я задаю новый вопрос.

Итак, в основном я работал в Pygame 1.9.3 и мне удалось создать простую 2D-игру с графикой. Я использую класс Sprite, и поэтому я часто использую методы Group (). Я рисую свою графику на экране, используя groupName.draw (screen).

Компонентом моей игры является способность взаимодействовать с местностью, например, удаление плиток и размещение плиток. Каждая плитка - это часть моего блока Sprite Group, которая рисуется на экране.

Однако моя программа начинает заметно отставать по мере увеличения числа блоков блоков. Вот что я сделал, чтобы попытаться противостоять этой проблеме:

  • Использовал .convert_alpha () для всех моих загруженных изображений
  • Загрузка изображений только один раз
  • Изменить целевой FPS (используя 60 атм)
  • Измените мою программу так, чтобы команда blockGroup.draw () вызывалась ТОЛЬКО при изменении среды. В основном, если среда изменяется, я перерисовываю блоки, делаю снимок экрана с моим окном, затем перетаскиваю это изображение, пока среда снова не изменится (это, как и ожидалось, вызывает задержку при создании снимков экрана)

Однако моя игра продолжает отставать.

Естественно, если я увеличу размер своих блочных спрайтов (имеется в виду, как я изменяю их размер при загрузке их соответствующих изображений), я могу в конечном итоге размещать больше блоков без задержки, поскольку общее количество спрайтов меньше, но это не идеально для того, чего я хочу достичь.

Кроме того, я реализовал 2 команды NPC, которые взаимодействуют с этой местностью. Таким образом, понятно, что моей программе нужно проверять множество коллизий в моем основном игровом цикле, но, тем не менее, я не ожидал, что моя программа запаздывает, если я не добавил в команду ~ 30 NPC (в настоящее время я работаю только с 10 NPC, по 5 на каждую команду).

Когда моя программа начинает лагать, я подсчитал общее количество спрайтов (суммируя все спрайты в каждой группе) равным 170.

Итак, наконец, мой вопрос: если я планирую иметь программу, которая использует несколько спрайтов (несколько ~ 170) одновременно, разве Pygame просто не подходит для работы с точки зрения скорости?

Я полагаю, что я использовал хорошие методы реализации, такие как удаление спрайтов из их соответствующих групп после их удаления и краткий список выше.

У меня был запрос на предоставление некоторого кода, поэтому вот некоторые важные части, которые я включил.

Основной игровой цикл:

# 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 ()

Большое спасибо за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...