Procedural Landmass Generation开源库测评

Procedural Landmass Generation开源库测评

【博物纳新】是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。

更多精彩内容请关注:lab.uwa4d.com


简介

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提供了很好的无限随机地形生成方案,性能方面也有很大的优化空间。

从适用性的角度来讲,它更适合于海岛场景,而在多山地形中水源分布没有规律,显得不够自然;对于山洞,峭壁,沟壑等特殊情况还需要对算法进行后续的改进。


今天的推荐就到这儿啦,或者它可直接使用,或者它需要您的润色,或者它启发了您的思路......

请不要吝啬您的点赞和转发,让我们知道我们在做对的事。当然如果您可以留言给出宝贵的意见,我们会越做越好。