Pygame :一种在显示大量对象之前快速查找屏幕内容的方法

Pygame : a fast way to find what is on screen before displaying it with insane amount of objects

我参与了一个 pygame 项目,该项目保存了大量的对象(100 000 + 对象)。 该脚本基于每组对象之间的大距离。为简单起见,该计划是一张无边界的地图,上面有一个在上面移动的相机。对象密度不大,我的意思是,我认为这不会通过每 1920 x 1080 的 500 个对象。

(说真的,500 个对象非常大)

即使我的屏幕上显示了 500 个对象,我也可以拥有稳定的 150 FPS,这非常好。不幸的是,当我 运行 脚本有更多的对象但在密度较小的更大区域时,问题就来了。

因此,如果程序需要显示它,我会创建一个函数来检查列表中的任何元素。

        for obj_x, obj_y , obj_size_x, obj_size_y in objects :                          # take value in a tuple in the list
            if (camera.x  - obj_size_x ) < obj_x < (camera.x + window.current_w ):      # if it not screen on x axis if continue else it's pass to the next objects
                if (camera.y - obj_size_y ) < obj_y < (camera.y + window.current_h):    #same but with y
                    pygame.draw.rect(window.screen, (0, 0, 0), (*(obj_x - camera.x, obj_y - camera.y),*(obj_size_x, obj_size_y)), 5) # the else is displayed

现在,这个函数在任何地方没有任何物体的情况下给我稳定的 350 FPS,在相机上显示 2500 个元素的情况下,60 FPS(并且没有其他形式的外部)。

但是如果我在地图上总共有 25 000 个元素,如果没有显示对象,我会得到 60 FPS 事件! 这是由 if 的执行时间导致的,它花费太多时间来检查一个对象是否在相机上。

但是有 100 000 个元素,当相机上没有任何东西时,运行 只有 25 PFS...

这里有一个更好的方法来计算什么显示更快?

您可以使用像 Quadtree 这样的数据结构来划分二维 space。这里的一大优势是您只需要遍历并检查那些有可能可见的对象。所有在空间上不与视口/相机相交的对象都将自动剔除,因为它们不可能是可见的。