提问者:小点点

关卡对象碰撞


我在游戏中使用 SDL2。

我有一个 std::vector 的 SDL_Rects(即矩形对象),它包含游戏中某个关卡的固体平台(即玩家无法通过的平台)。

检查冲突时,我当前的代码执行以下操作:

for (SDL_Rect rect : rects) {
    if (player.collides(rect)) {
        // handle collision
    }
}

考虑我有一个包含许多(例如 500)实心平台矩形的关卡,遍历所有矩形并检查碰撞是否效率低下?有没有更好的方法可以做到这一点?

collides() 函数只检查 AABB 冲突(4 个简单条件)。


共1个答案

匿名用户

我认为这是合理的。您有简单的形状,并且正在执行简单的碰撞检查。想象一下,一个图形更加激烈的游戏。即便如此,他们也可能为角色提供复杂的骨架网格体,但只需针对易于计算的边界形状进行碰撞检查,他们可能同时发生 500 多件事。

在更复杂的游戏引擎中,不同类型的类型可能会阻止某些类型,而不是阻止其他类型,因此它不仅要检查简单的重叠事件,还必须知道重叠对象是否应该交互。或者,不同的对象可能存在不同的交互。

对于游戏,总的来说,你的瓶颈是渲染和相关计算,所以除非你知道你有可能用游戏逻辑做一些非常慢的事情(复杂的路径查找或人工智能或类似的东西),否则我会把优化工作集中在渲染上。