摘要:本文以我自己设计植物大战僵尸碰撞检测算法为例进行分析,浅谈游戏开发中碰撞检测算法。本文所提及的碰撞算法与数据结构也可应用于跑酷等游戏中。
关键优化技术1:只检测逻辑上可能存在碰撞关系的物体。比如植物大战僵尸中,植物发射的子弹只能打击其所在行的僵尸,因此子弹只需遍历检测本行的僵尸,而不是存在场景中的全部僵尸。对于地铁跑酷,奔牛跑酷,吃金币的碰撞检测算法亦是如此。
关键优化技术2:子弹检测碰撞僵尸,或是僵尸检测碰撞子弹,谁检测谁碰撞谁的问题,这个可能跟具体项目息息相关。可以从算法效率,以及设计模式上角度出发进行考虑。
关键优化技术3:精细范围检测。比如绝大多数情况下,排在最前方的子弹会首先打击到排在最前方的僵尸。后面的所有子弹在第一个子弹没有碰撞的情况下,无需进行碰撞检测,问题转化为一个子弹检测一个僵尸!。
关键优化技术4:注意精细范围的切换,因为僵尸进入植物区后,优化后,准确的说是越过能发射豌豆的植物。本行的所有子弹都需要检测本行所有的僵尸。此点可保证算法的正确性。
关键优化技术5:数据结构的选取。鉴于游戏的设计,僵尸和子弹的集合是一个频繁的插入和删除的集合。因为关键优化技术3,我们需要集合保持有序!
有序数组并不合适,利用二分查找法确定插入位置,时间复杂度O(lgN),但因为插入删除操作过于频繁,数组会浪费大量性能来维护内存时间复杂度为O(N)。
那么有序链表呢?有序链表的插入和删除无需大量操作内存时间复杂度O(1),但是顺序遍历确定插入位置,时间复杂度为O(N)。
既能保持有序,又能快速的插入和删除的数据结构,红黑树,或是带有排序功能的哈希表。我们可以利用C++ STL的set或是iOS sdk orderedSet已有实现。
关键优化技术6:享元模式运用。内存池,即僵尸池和子弹池,避免重复创建对象,反复开辟内存。