Conan建筑 —— 服务器优化 建筑碰撞数据

最近头疼在碰撞数据这,我们策划建的中型建筑,光单个部落碰撞数据就有几十M,老大让优化这里。

先说下现状吧,之前不是说过给建筑加了体素化的碰撞数据。然后在服务器做了 每个碰撞数据和每个建筑的相互映射。对,相互就像这样——Map<int,List<Building>>、Map<Building,List<int>>,来方便查询和剔除。

这还是一个规模适中的建筑。

 存储上的优化空间没啥办法了,规模放在这。只能跟算力配合了。

大概会有这几个方案吧:

1、首先是考虑是不是所有的建筑都需要碰撞数据,剔除一部分,主要靠前端去校验。比如干掉所有结构建筑的数据。这样的结果就是,服务器结构建筑和家具之间的碰撞无法验证,进而两个玩家同时在一个地方,分别进行结构建筑(eg.墙)和家具的建造,前端无法在这一时刻判断没有到来的东西是否影响建造。解决办法:加周围建筑立方块的建造冷却,能有很大缓解,但是不解决本质问题,这样只是减小了错误的几率。

 2、第二种也是比较粗鲁的,加个计时器定时卸载,但是这个会有瞬时压力。假如某一时刻都卸载了但是好多部落都在调用验证,瞬间要加载好所有数据。

3、1和2都比较粗鲁,其实可以结合一下。由于我们在架构的时候,已经将所有的建筑都按立方块来存储了。潜在的含义是,我们已经对所有建筑进行了空间位置上的归类。在存储方式上,立方块存储了在他里面的所有建筑,这样我们其实就可以做到按立方块进行碰撞数据加载,用完了多久卸载还是立马卸载,到时候看情况吧。但是这样做也有弊端,以为有些家具体积太大,占据了甚至几十个立方块,但是这些个立方块有没有存该家具(主要原因是,策划并不想配置占据信息,其实这里策划相配的话,把占据立方块信息也能配表)。¥¥所以,其实我们就可以参考1的思路,只对家具的碰撞数据常驻内存,结构建筑实施计算碰撞。如果这样了,潜在的问题是 还是担心瞬时碰撞数据的读取压力 加上 有些人就是喜欢建造家具,他建一堆,emmmm,不过个例还是得用数据测。

为什么结构建筑要剔除或者不常驻?因为绝大多数建筑其实都是结构建筑,并且结构建筑不需要碰撞数据。最初的用碰撞数据来验证是否可建造,是家具的出现,家具是自由的任意摆放,相比结构建筑,则是摆放在固定的位置,且要避免穿模也是避免和家具的穿模。

为什么可以实时知道,哪些建筑要加载碰撞数据?我打算加载当前家具的主块的周围3*3的主立方块里的所有建筑。我在建筑场景初始化的时候就吧建筑数据写到它的主立方块和有占用面需求的临立方块里了。之前的模块其实还包含了根据范围获取建筑的功能,以供 获取炸弹和范围内建筑 的功能。这个其实也简单,用范围半径 / 立方块的长度 得到要跨越n个立方块,然后遍历 上下左右 2n * 2n * 2n 个立方块内的所有建筑,获取世界坐标计算膜长,进一步剔除不在范围内的建筑,同时根据碰撞数据 受影响的获取家具,就可以得到范围内所有建筑。

 思路就是这样了,开干。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值