【问题标题】:Poor collision performance pygame碰撞性能差的pygame
【发布时间】:2019-10-17 18:07:31
【问题描述】:

我正在使用 pygame 在 python 中编写一个相当基本的 2d 自上而下地牢爬行类游戏。一切都很顺利,除了碰撞。现在,我有一个 tilemap 系统,它可以读取 tilesheet,然后将正确的图像绘制到屏幕上。我正在尝试为所有“墙类型”图像添加碰撞,所以我构建了一个函数,每次有墙时都会绘制矩形,然后将它们添加到列表中。这是我的 add_collider 函数:

rect_list = []

def add_collider(window, x, y):
    rect = pygame.rect = (x*32, y*32, 32, 32)
    pygame.draw.rect(window, [255, 0, 0], rect, 1)
    rect_list.append(rect)

然后在我的主游戏循环中,我可以检查我的玩家矩形是否与我的任何对撞机相交。这工作正常,除了游戏在运行大约 10 秒后减速停止。我认为这是因为我每秒运行大约 30-40 个对象的 for 循环 30 次(游戏的帧速率)。这是游戏循环:

while run:
    clock.tick(30)
    #player.get_collider() returns a rectangle around the player,
    #essentially the hitbox of the player
    for c in collider.get_collider():
        if player.get_collider().colliderect(c):
            print('Collide')
            #just setting the player's position to 400,400 for now until I figure this out
            player.x = 400
            player.y = 400

    redrawGameWindow()

一定有更好的方法。据我所知,这可能是一种完全错误/糟糕的做事方式。如果我需要重做我的碰撞逻辑,那很好,我只想要更好的性能。感谢您提供任何帮助或提示。

【问题讨论】:

  • 当然“每秒 30 次大约 30-40 个对象的 for 循环” 无法解释这种快速的性能下降。请注意,这只是每秒 1200 次碰撞测试 (colliderect)。您是否每帧添加一次矩形 (rect_list.append(rect)) 并且列表会增长到无限?
  • 在新框架中添加元素之前,您是否清除了rect_list?在每一帧打印len(rect_list),看看你有多少元素。
  • 这与当前问题无关,但是当您的地图变大时,可能值得将所有地图对象划分为四叉树等,以便更有效地搜索碰撞。或者可能只检查播放器 N 个单位内的碰撞。
  • @Rabbid76 就是这样!非常感谢,我不知道我怎么没听懂。

标签: python pygame collision


【解决方案1】:

当然,“每秒 30 次大约 30-40 个对象的 for 循环”不能解释这种快速的性能下降。请注意,这只是每秒 1200 次碰撞测试 (colliderect)。
但是,您每帧向列表添加一次新的矩形 (rect_list.append(rect)),并且列表会增长到无限。快速增长的列表会导致性能问题。
预先创建一次矩形列表或在每一帧中清除列表(rect_list.clear())。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2020-05-21
    • 1970-01-01
    相关资源
    最近更新 更多