【笔记】unity大地图分块加载

1.大地图分块加载
    chunk的大小可动态调整
    写工具做地块拆分
        如果地块是由1个个小格子单元组成的,则可按位置进行划分保存成多个chunk预设
        如果地表是Terrain转成的mesh,或者美术做的整个mesh,则需要通过对chunk边界的顶点进行拷贝,分别保存成多个chunk预设
    保存地图上的chunk数据
    地块的加载(通过松散四叉树或者kd树进行管理)
        1是九宫格加载
        2是chunk比较大时,例如角色视野范围内都是1个chunk的时候,可以单chunk加载+chunk缓存
        3是
            slg地图形式的,n×m个chunk组成一个大的chunk,相机视野区域小于这个大的chunk,在大的chunk上限定左右上下的刷新阀值
            相机视野区域移动到这个chunk刷新边界的时候,进行获取数据,更新视野范围内的大chunk的数据层,触发地图表现层属性    
    分块烘培以及lightmap数据的加载
        https://zhuanlan.zhihu.com/p/110325477
        在chunk的预设上加上重新设置lightmap的组件,记录下lightmapindex和lightmapOffsetScale
    地块加载的缓存
        例如从玩家从chunk1进入到chunk2,则异步记载chunk2,同时chunk1开始计时,超过计时则移除掉chunk1
        如果玩家在计时范围内又回到了chunk1则,计时清零(此方法对于九宫格加载和单块加载都适合)
    Navmesh,块与块之间怎么导航
        1是将所有chunk都进行navmesh烘培,运行时这个navmesh作为基础数据进行加载,只有在离开这个大地图时才卸载
        2是使用OffMeshLink进行连接,比较依赖于地图的环境地形
    多种地形的过渡和融合(slg的地图,比如草地、土地、雪地、水面)
        1是制作地形刷(类似war3的拼接算法)
            https://blog.csdn.net/weixin_33814685/article/details/90163268
            地图划分为n×n个Grid
            16个tile素材,如果第一次对这个Grid设置的是1,第二次对这个Grid设置的是4,则格子地块的新的tile索引为5(也就是4+1)
            当单个格子Grid的索引值大于15时,就不需要再次进行处理了,因为这时候已经铺满了这个Grid
            也可以超过16个tile的素材,超过15索引的tile贴图都是铺满地面的草,且细节表现不一样,例如地表上的花草不一样
        2是写拼接算法,RpgMaker和Tiled编辑器
    插件
        SliceTerrain,地形切割
        MultipleTerrainBrush擦肩,同时对多个chunk的场景进行编辑
        TerrainToMesh,将Terrain导出成mesh
        T4M是刷地表贴图
    大量物体的剔除,遮挡,lod,合批问题
        1是旧的渲染管线用DrawMeshInstanced + GPUInstance+jobsystem(做裁减)            
        2是DrawMeshInstanced+Dots,3w个带移动和动作的单位没有问题
        3是GPUInstance+SRP Batch,这个方案,渲染批次会减少,当时剔除很慢
        4.DrawMeshInstancedIndirect,需要ComputeShader,目前移动端支持不好,pass掉
            先在CPU端用四叉树吧数据管理起来,jobsystem做视锥裁剪,GPU端用Computer shader做精准裁剪,得到的buffer直接提供给VS,FS使用
        5是BatchRendererGroup+自定义裁减算法(四叉树等)+JobSystem(裁减函数OnPerformCulling的返回值,利用多线程计算裁减)+SRPBatch
            几十万个静态物体(例如植被),一次剔除几毫秒(这个技术提升了剔除的速度)
            需要记录植被信息,包括植被的平移,旋转,缩放,颜色(或其他GPUInstance的变量)Mesh,LodMesh,Lod信息,材质等,
            然后保存成Asset,用Asset去构建RenderBatchGroup
            可以使用AddBatch添加lodMesh和Mesh,添加平移旋转缩放矩阵,进行cull,cull里做了2件事1是视锥体裁减,2是根据lod决定显示哪一级mesh
            参考:https://zhuanlan.zhihu.com/p/105616808
            限制:unity版本需要支持URP,2019.3以上
    超大地图的情况下,lightmap太大,terrain不支持的问题
        貌似是用houdini做地形            
    如果chunk1边界上的物体1对chunk2上的物体2有阴影投影怎么处理
        1是减少此类设计
        2是在烘培的时候拷贝物体1到chunk2上,烘培完成后,删除物体1,这样就保存了烘培效果

你可能感兴趣的:(笔记)