如何使用 pygame/pytmx 加速或优化用于碰撞检测的循环?

How to speed up or optimize for loop used for collision detection using pygame/pytmx?

我在尝试使用 pygame 制作游戏时使用 for 循环结合 .colliderect() 进行碰撞检测,循环变得太慢了 ~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 并仅使用已经构建的 Rect 列表的行,这限制了函数调用。

没有最小的工作示例,很难给出有说服力的建议。

正如我在评论中所述,对 "load_pygame" 函数的虚假调用似乎在这段代码中读取文件数据 - 仅此一项就可能是导致速度变慢的原因。此外,读取的数据不用于碰撞检测。

我没有的另一个建议是让你的墙壁矩形在精灵组中预先计算,而不是在每次检查时为所有墙壁创建新的矩形: pygame.Rect(obj[0],obj[1],16,16).colliderect(PlayerRectangle))。然后你可以使用精灵方法 "spritecollideany" - https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.spritecollideany - 这应该优化矩形碰撞验证。

(这也要求您的 Player 对象是 Sprite,如果它还不是的话)。