水平物体碰撞
Level object collision
我在游戏中使用 SDL2。
我有一个 std::vector 的 SDL_Rects(即矩形对象),用于容纳游戏中关卡的实体平台(即玩家无法通过的平台)。
检查碰撞时,我当前的代码执行以下操作:
for (SDL_Rect rect : rects) {
if (player.collides(rect)) {
// handle collision
}
}
考虑一下我的关卡有很多(例如 500 个)实心平台矩形,遍历所有矩形并检查碰撞是否效率低下?有更好的方法吗?
collides() 函数仅检查 AABB 碰撞(4 个简单条件)。
我认为这是合理的。你有简单的形状并且正在做简单的碰撞检查。想象一个图形更激烈的游戏。即便如此,他们可能有一个复杂的角色骨架网格物体,但只是针对一个易于计算的边界形状进行碰撞检查,他们可能同时处理超过 500 件事情。
在更复杂的游戏引擎中,不同的类型可能对某些类型阻塞而对其他类型不阻塞,因此它不仅要检查简单的重叠事件,还必须知道重叠对象是否应该交互或不是。或者不同的对象可能会有不同的交互。
对于游戏,一般来说你的瓶颈是渲染和相关的计算,所以除非你知道你有危险用游戏逻辑(复杂的路径查找或 AI 或类似的东西)做一些非常缓慢的事情,我会把我的优化工作集中在渲染上。
我在游戏中使用 SDL2。
我有一个 std::vector 的 SDL_Rects(即矩形对象),用于容纳游戏中关卡的实体平台(即玩家无法通过的平台)。
检查碰撞时,我当前的代码执行以下操作:
for (SDL_Rect rect : rects) {
if (player.collides(rect)) {
// handle collision
}
}
考虑一下我的关卡有很多(例如 500 个)实心平台矩形,遍历所有矩形并检查碰撞是否效率低下?有更好的方法吗?
collides() 函数仅检查 AABB 碰撞(4 个简单条件)。
我认为这是合理的。你有简单的形状并且正在做简单的碰撞检查。想象一个图形更激烈的游戏。即便如此,他们可能有一个复杂的角色骨架网格物体,但只是针对一个易于计算的边界形状进行碰撞检查,他们可能同时处理超过 500 件事情。
在更复杂的游戏引擎中,不同的类型可能对某些类型阻塞而对其他类型不阻塞,因此它不仅要检查简单的重叠事件,还必须知道重叠对象是否应该交互或不是。或者不同的对象可能会有不同的交互。
对于游戏,一般来说你的瓶颈是渲染和相关的计算,所以除非你知道你有危险用游戏逻辑(复杂的路径查找或 AI 或类似的东西)做一些非常缓慢的事情,我会把我的优化工作集中在渲染上。