空间剪枝优化
# 判断一个物体在左侧还是右侧
只需要求出主角与物体的差向量,并与前方向做叉积即可
* 结果>0 则在右侧
* 结果<0 则在左侧
* 结果=0 则在正前方或正后方
# 空间剪枝优化
1. 判断物体是否在相机内
对于一个物体,判断是否在相机内unity已经有了实现,但是假设我现在有一堆树,我想知道有多少棵树在相机内呢,直接遍历所有的树会导致我们的开销非常大
2. 在一个100*100的空间内,随机生成2000个1*1的小方块,小方块生成后会随机赋予一个初速度,
小方块将沿速度方向匀速运动,碰到空间边界会反弹。小方块之间不会反弹。现在需要检查方块是否与其他方块发生了碰撞(相交)
显然如果直接n^2来遍历判断,肯定会卡死,那这两个问题有没有非遍历方案呢?
# 优化方案
1. 网格划分
事实上,只有离的近的小方块才会相交,也只有一部分的树才会在相机内,我们可以把空间进行划分成块,只对小方块所在的空间块内的方块做碰撞检测,
就可以优化大部分的检测了
但是,随着空间的变大,小方块体积的变化,分配不均等问题,会导致网格的大小选取很困难,网格变多了也会造成一笔内存开销,有没有折中的方案呢?
2. 四叉树/八叉树
我认为其本质就是升维二分法,将空间通过递归不断的拆分下去,我们会选择最大划分层次以及最大包含对象数量来作为递归基,这样就可以通过树形结构
来快速的查询交互关系了,但是实际工程中,物体都是有大小的,如果出现了占地多个节点的物体该如何处理呢?
#方案1#
只在叶子节点中存储物体,如果无法完美存储则存储在相交的叶子节点中
#方案2#
可以在非叶子节点存储物体,无法划分的物体则保留
这两种方案可以说是各有优劣,第一种方案由于会存储多个节点,导致物体移动时树的变化开销增大,而第二种由于一个节点存储的内容更多,会导致检测了
一些遥远的物体,如果能把物体抽象成点就更好了
参考博客:https://blog.csdn.net/yhn19951008/article/details/119899092