Как ускорить или оптимизировать цикл, используемый для обнаружения столкновений с помощью pygame/pytmx?
Я использую цикл for в сочетании с.colliderect() для обнаружения столкновений при попытке создать игру с использованием pygame, цикл становится слишком медленным с ~340 прямоугольниками стены, мне было интересно, может ли он быть как-то быстрее, потому что это сильно влияет на игру игровой цикл?
Я пытался использовать координатные точки в разных местах на каждой стене, но работает, только если вы перемещаете определенное количество пикселей за раз, и каждый раз, когда вы вдвое уменьшаете скорость движения, это в четыре раза увеличивает количество сохраняемых координатных точек.
#disregard indent, this is all in an update function that is called every time that a player decides to move.
self._old_position = self.position
PlayerRectangle = pygame.Rect(self.position[0]+ x,self.position[1]+y,16,16)
cwd = os.getcwd()
tmxData = load_pygame(cwd+"\\Maps\\TestfileMap.tmx")
movement = True
for obj in self.walls:
if(pygame.Rect(obj[0],obj[1],16,16).colliderect(PlayerRectangle)):
movement = False
self.move_back()
else:
continue
if movement:
self.position[0] += x
self.position[1] += y
self.stats["position"]=self.position
self.rect.topleft = self.position
self.feet.midbottom = self.rect.midbottom
Предоставленный код работает, однако он слишком медленный, мне было интересно, есть ли другой способ обнаружения столкновений или есть способ сделать то, что показано, быстрее, это сильно мешает. Спасибо
РЕДАКТИРОВАТЬ:
Таким образом, решение было в основном, что у меня было load_pygame, который запускался буквально каждый раз, когда он зацикливался, просто убирал строку, которая делает это, и это проясняло вещи намного больше, для дальнейшей оптимизации измените строку, которая делает Rect для каждого объекта, и просто используйте список Rects, которые уже построены, это ограничивает вызовы функций.
1 ответ
Без минимального рабочего примера сложно дать напористый совет.
Как я отмечал в комментариях, существует ложный вызов функции "load_pygame", которая, похоже, считывает данные файла внутри этого кода - только она может стать причиной вашего замедления. Более того, считанные данные не используются при обнаружении столкновений.
Другой совет, который я не могу дать, - это предварительно рассчитывать прямоугольники ваших стен в группе спрайтов, вместо того, чтобы создавать новые прямоугольники для всех стен при каждой проверке с помощью: pygame.Rect(obj[0],obj[1],16,16).colliderect(PlayerRectangle))
, тогда вы можете использовать метод sprite "spritecollideany" - https://www.pygame.org/docs/ref/sprite.html - который должен оптимизировать проверку столкновения прямоугольника.
(Это также потребует, чтобы ваш объект Player был Sprite, если это еще не сделано).