超高效的不规则物体碰撞检测<效率优化>
原贴:超高效的不规则物体碰撞检测
相信已经有很多人使用过了这个像素级精确碰撞类,作者很NB思路很清晰。
但是在使用过程中,这个方法的实际效率并不是很高效,对于大一点的对象或者碰撞面积比较大的话来个1000次循环就已经超15秒了。这限制了如此优秀的算法在实际项目中的运用。在此由于论坛有讨论精确碰撞的贴,于是在原算法上加了一点小想法来优化检测效率,并且分享给大家。
首先原算法判断效率的关键就是两个对象重叠的矩形面积,面积越大效率越低。那么控制每次draw的面积就成了控制效率的关键。举个简单例子,绘制检测一次100*100的面积总比不上检测3到4次10*10的来的快。
原先的BitmapData之间精确判断顺序是这样的。
1。判断2容器矩形是否有重叠
2。有重叠则取两个容器的重叠部分draw到一个新BitmapData中并且把有色彩的部分全部纯色化,A容器放进去后B容器以一个滤镜模式再绘制进去。
3。判断该容器是否有A容器的颜色和B容器的颜色经过滤镜后产生的颜色。有就表示有碰撞,无则无碰撞。
优化的判断顺序如下:
1。判断2容器矩形是否有重叠
2。计算2容器的尺寸大小缩小到20*20需要缩小多少倍率,同时根据这个倍率重新计算重叠部分,也就是缩小后的重叠部分。
3。向一个20*20的BitmapData中绘制2个容器对象,经过一系列计算获取碰撞部分。
4。这时的重叠部分是缩小后图像的重叠部分,实际尺寸这个区域内可能并未碰撞,所以在压缩检测时有碰撞就需要进行再次检测。而检测时候把之前的倍率重新计算,计算原理是:由于获得碰撞区域一般都比原先矩形重叠部分小,那么用计算得来的这个区域代替原来的矩形重叠区域重新计算(跳到第2步)。
5。一直到缩小倍率降为1时仍然有碰撞,则说明2容器对象确实产生了碰撞。那么实际检测面积就是20*20*检测次数。(实际检测中就算测试对象尺寸6K*3K也很少会进行4次以上)
优化结果上对于超大尺寸可以提升5倍效率,小尺寸20*20以内打平,大于20*20的提升50%-500%不等。
不过里面有一些判断并非完善,希望大家在使用过程中多多改进。
详细的过程请看类包里的注释,如有疑问请跟贴。
源代码以及测试文件:
bitmapDataHitTestPlus.rar (44.83 KB)
相信已经有很多人使用过了这个像素级精确碰撞类,作者很NB思路很清晰。
但是在使用过程中,这个方法的实际效率并不是很高效,对于大一点的对象或者碰撞面积比较大的话来个1000次循环就已经超15秒了。这限制了如此优秀的算法在实际项目中的运用。在此由于论坛有讨论精确碰撞的贴,于是在原算法上加了一点小想法来优化检测效率,并且分享给大家。
首先原算法判断效率的关键就是两个对象重叠的矩形面积,面积越大效率越低。那么控制每次draw的面积就成了控制效率的关键。举个简单例子,绘制检测一次100*100的面积总比不上检测3到4次10*10的来的快。
原先的BitmapData之间精确判断顺序是这样的。
1。判断2容器矩形是否有重叠
2。有重叠则取两个容器的重叠部分draw到一个新BitmapData中并且把有色彩的部分全部纯色化,A容器放进去后B容器以一个滤镜模式再绘制进去。
3。判断该容器是否有A容器的颜色和B容器的颜色经过滤镜后产生的颜色。有就表示有碰撞,无则无碰撞。
优化的判断顺序如下:
1。判断2容器矩形是否有重叠
2。计算2容器的尺寸大小缩小到20*20需要缩小多少倍率,同时根据这个倍率重新计算重叠部分,也就是缩小后的重叠部分。
3。向一个20*20的BitmapData中绘制2个容器对象,经过一系列计算获取碰撞部分。
4。这时的重叠部分是缩小后图像的重叠部分,实际尺寸这个区域内可能并未碰撞,所以在压缩检测时有碰撞就需要进行再次检测。而检测时候把之前的倍率重新计算,计算原理是:由于获得碰撞区域一般都比原先矩形重叠部分小,那么用计算得来的这个区域代替原来的矩形重叠区域重新计算(跳到第2步)。
5。一直到缩小倍率降为1时仍然有碰撞,则说明2容器对象确实产生了碰撞。那么实际检测面积就是20*20*检测次数。(实际检测中就算测试对象尺寸6K*3K也很少会进行4次以上)
优化结果上对于超大尺寸可以提升5倍效率,小尺寸20*20以内打平,大于20*20的提升50%-500%不等。
不过里面有一些判断并非完善,希望大家在使用过程中多多改进。
详细的过程请看类包里的注释,如有疑问请跟贴。
源代码以及测试文件:
![](http://bbs.9ria.com/images/attachicons/rar.gif)