碰撞检测技术:blockmap
参考:http://dev.gameres.com/Program/Visual/Effects/pengzhuang.htm
在<StarLoster>中,有500颗星星,要进行250000次的碰撞检测,本来没当回事,因为一次检测只不过是两次乘法,两个减法,一个加法和一个比较的运算量,但实际上确实是贞速率的瓶颈. 用上文的方法的话应该更好:
如果把世界划分成格,每个占据其中的星星都被加入它的链表,只要分别对每个格子链表中的星星做检测就可以了. 这样会比较节省时间.
具体地说:
划分格子的数量可以根据星星数来安排,正比关系. starpool[]可以做成静态链表,就是内存池,它提供自己的alloc和free,时间都是O(1). 然后格子的结构中只需提供一个表头结点即可. 应该可以把starpool和grid做成两个对象,它们之间用starpool::alloc()提供的星星指针进行联系. 这种实现不会多用内存,只是每贞都要重新设置链表好象不太爽,不知有没有解决方法~
在<StarLoster>中,有500颗星星,要进行250000次的碰撞检测,本来没当回事,因为一次检测只不过是两次乘法,两个减法,一个加法和一个比较的运算量,但实际上确实是贞速率的瓶颈. 用上文的方法的话应该更好:
如果把世界划分成格,每个占据其中的星星都被加入它的链表,只要分别对每个格子链表中的星星做检测就可以了. 这样会比较节省时间.
具体地说:
划分格子的数量可以根据星星数来安排,正比关系. starpool[]可以做成静态链表,就是内存池,它提供自己的alloc和free,时间都是O(1). 然后格子的结构中只需提供一个表头结点即可. 应该可以把starpool和grid做成两个对象,它们之间用starpool::alloc()提供的星星指针进行联系. 这种实现不会多用内存,只是每贞都要重新设置链表好象不太爽,不知有没有解决方法~