当前位置: IT大杂烩 > Ubuntu  > 【Hibernate步步为营】--双向关联一对一映射详解(一)

【Hibernate步步为营】--双向关联一对一映射详解(一)

www.someabcd.com  网友分享于:Jun 8, 2018 6:08:47 PM

标签:c   a   数据   set   算法   os   

摘要:本文以我自己设计植物大战僵尸碰撞检测算法为例进行分析,浅谈游戏开发中碰撞检测算法。本文所提及的碰撞算法与数据结构也可应用于跑酷等游戏中。


关键优化技术1:只检测逻辑上可能存在碰撞关系的物体。比如植物大战僵尸中,植物发射的子弹只能打击其所在行的僵尸,因此子弹只需遍历检测本行的僵尸,而不是存在场景中的全部僵尸。对于地铁跑酷,奔牛跑酷,吃金币的碰撞检测算法亦是如此。


关键优化技术2:子弹检测碰撞僵尸,或是僵尸检测碰撞子弹,谁检测谁碰撞谁的问题,这个可能跟具体项目息息相关。可以从算法效率,以及设计模式上角度出发进行考虑。


关键优化技术3:精细范围检测。比如绝大多数情况下,排在最前方的子弹会首先打击到排在最前方的僵尸。后面的所有子弹在第一个子弹没有碰撞的情况下,无需进行碰撞检测,问题转化为一个子弹检测一个僵尸!。


关键优化技术4:注意精细范围的切换,因为僵尸进入植物区后,优化后,准确的说是越过能发射豌豆的植物。本行的所有子弹都需要检测本行所有的僵尸。此点可保证算法的正确性。


关键优化技术5:数据结构的选取。鉴于游戏的设计,僵尸和子弹的集合是一个频繁的插入和删除的集合。因为关键优化技术3,我们需要集合保持有序!

有序数组并不合适,利用二分查找法确定插入位置,时间复杂度O(lgN),但因为插入删除操作过于频繁,数组会浪费大量性能来维护内存时间复杂度为O(N)。

那么有序链表呢?有序链表的插入和删除无需大量操作内存时间复杂度O(1),但是顺序遍历确定插入位置,时间复杂度为O(N)。

既能保持有序,又能快速的插入和删除的数据结构,红黑树,或是带有排序功能的哈希表。我们可以利用C++ STL的set或是iOS sdk orderedSet已有实现。


关键优化技术6:享元模式运用。内存池,即僵尸池和子弹池,避免重复创建对象,反复开辟内存。

【Hibernate步步为营】--双向关联一对一映射详解(一),布布扣,bubuko.com

【Hibernate步步为营】--双向关联一对一映射详解(一)

标签:c   a   数据   set   算法   os   

发布此文章仅为传递网友分享,不代表本站观点,若侵权请联系我们删除,本站将不对此承担任何责任。
Copyright ©2018  IT大杂烩  版权所有  京ICP备11030978号-1 网站地图