Procedural Landmass Generation开源库测评
- 作者:admin
- /
- 时间:2019年04月24日
- /
- 浏览:4010 次
- /
- 分类:博物纳新
简介
Procedural Landmass Generation(过程式地块生成)是一个用来实现无限随机地形生成的开源项目,原作者以教程的形式由浅入深地展示了整个框架的构建。
开源库链接:https://lab.uwa4d.com/lab/5b5cd12cd7f10a201fe9680d
特点
1、通过柏林噪声(Perlin Noise)生成地形的高度图
- 柏林噪声:相比于平常的黑白像素随机排布,它的灰度值拥有平滑过度。
2、由高度图产生地形网格(mesh)
- 顶点生成:
float height = heightMap [x, y]
meshData.AddVertex (new Vector3(vertexPosition2D.x, height, vertexPosition2D.y), percent, vertexIndex);
- 三角面生成:
int currentIncrement = (isMainVertex && x != numVertsPerLine - 3 && y != numVertsPerLine - 3) ? skipIncrement : 1;
int a = vertexIndicesMap [x, y];
int b = vertexIndicesMap [x + currentIncrement, y];
int c = vertexIndicesMap [x, y + currentIncrement];
int d = vertexIndicesMap [x + currentIncrement, y + currentIncrement];
meshData.AddTriangle (a, d, c);
meshData.AddTriangle (d, a, b);
3、不同的高度拥有不同的颜色和纹理
- 可根据高度配置多种覆盖类型
4、以特定对象为中心生成,支持LOD网格切换,以及局部碰撞计算
上图为LOD网格切换图示,黑色区域是密集的网格线条,可以看到由中心到外围有多层LOD
绿色高亮区域为碰撞网格,只在中心区域进行碰撞计算
5、灵活的参数控制
- 下文会介绍部分参数的意义与用法
6、保存已生成的地形
参数
地形高度图的生成可以看做多个频谱图的叠加。
Amplitude 幅度
Frequency 频率
Octave 倍频:
频率为一定倍数的频谱图,代表了细节层级的数量。
Lacunarity (>=1) 间隙度:
决定倍频的倍数,控制所有频谱图的频率,对层级越高的细节影响越大,增加该值会使细节更“细”,可以形成“嶙峋”的山势。
Persistence(0-1) 保持度:
控制所有频谱图的幅度,同样对层级越高的细节影响越大,增加该值会使细节对基本轮廓的影响变大。值为0时只有平滑的基本轮廓,为1时因幅值相同的频谱图叠加与抵消使得地形趋于平面。
Seed 种子:
不同值有不同的随机地形。
FalloffMap
原噪声图叠加一副辐射状灰度图使单个地形块的四周灰度值接近为0,体现为地形块“四面环海”,如同“群岛”。
通过改变地形块相对于噪声图的大小还也可形成“孤岛”。
性能测评
我们以小米5S为例,结合使用GOT Online的Overview模式和Assets模式,测试其在自由漫游下的性能表现:
多层LOD网格的测试画面
1、首先是高精度网格测试
LOD0 200码 \ LOD1 400码
帧数在更新地图块时会出现明显的波动
查看逻辑代码耗时,不出所料主要集中在了地形生成的更新函数(TerrainGenerator.Update)里,它是由CPU负责,用来监听和进行地形块的生成以及碰撞网格的计算。
TerrainGenerator.Update峰值的平均值约为240ms
2、增加网格细节层级,降低网格精度
LOD1 100码 \ LOD2 200码 \ LOD3 300码 \ LOD4 400码
降低精度后帧数较之前就稳定了很多
TerrainGenerator.Update耗时有所缩减
TerrainGenerator.Update峰值的平均值约为65ms,有了大幅降低,表现为卡顿现象明显缓解。
简言之,每次更新新的地图块时,即便是骁龙821,在应对复杂的网格计算以及碰撞计算也会伴随着明显的掉帧与卡顿,因此对于移动端,我们应该适当地简化生成的网格,从而获得更好的性能表现。
接下来我们再来看一下它的内存占用
1、高精度网格
网格资源数量(5000帧时约为240个)
网格内存占用(5000帧时约为130MB)
2、增加网格细节层级,降低网格精度
网格资源数量(5000帧时约为400个)
网格内存占用(5000帧时约为50MB)
优化网格精度后虽然网格资源数目上升,但网格内存占用有了明显下降。
值得关注的是,随着地形块增加,内存占用也不断上升。因而在兼顾游戏的流畅体验和合理的内存占用之间,就必须确定一定的阈值,用来销毁过多的网格资源。
在实际应用中,开放地图的尺度主要取决于角色的行动能力,所以在内存占用方面也要根据实际情况进行分析优化。
小结
总的来说,Procedural Landmass Generation提供了很好的无限随机地形生成方案,性能方面也有很大的优化空间。
从适用性的角度来讲,它更适合于海岛场景,而在多山地形中水源分布没有规律,显得不够自然;对于山洞,峭壁,沟壑等特殊情况还需要对算法进行后续的改进。
今天的推荐就到这儿啦,或者它可直接使用,或者它需要您的润色,或者它启发了您的思路......
请不要吝啬您的点赞和转发,让我们知道我们在做对的事。当然如果您可以留言给出宝贵的意见,我们会越做越好。
【博物纳新】是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。
更多精彩内容请关注:lab.uwa4d.com