Во-первых, я заранее изучил эту тему по 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 ()
Большое спасибо за ваше время.