Unity5 植被系统分析

一、 功能分析

1. SpeedTree for Unity5

费用:

19美金/每月

功能:

易用且表现自然的内嵌植被枝干及树叶编辑功能

自动生成随机变形模型

不同植被模型LOD切换(远处生成公告板)

投影及环境遮挡效果

未确认的功能:

光照图支持程度

植被自适应地形颜色

2. TreeCreator in Unity

功能:

使用树干/树叶节点程序化自动生成树木模型(效果不是很自然)

支持环境遮挡

较难控制模型面数

树干树叶需使用不同的材质

3. Tree Brush in Terrain

功能:

将树木模型刷到地形上(要求树木Prefab的MeshRenderer必须在根节点上,且只有一个。)

自动合批绘制

自动生成公告板用于在远处显示(要求必须使用特定的植被Shader)

支持碰撞体

随机变化高度

随机变化颜色

不支持的功能:

不同模型LOD切换

植被自适应地形颜色

4. Grass Mesh and Texture in Terrain

功能:

将草的模型刷到地形上(要求树木Prefab的MeshRenderer必须在根节点上,且只有一个。)

仅指定草的纹理,自动生成矩形面片刷到地形上。

随机变化高度

随机变化颜色

草的矩形面片根据摄像机朝向旋转(可关闭)

受风力影响的摆动

不支持的功能:

LOD切换及远处使用公告板优化

植被自适应地形颜色

与角色等物体碰撞而产生扰动

二、 性能测试

测试机型:

红米 NOTE 1 LTE

内存 2 GB

分辨率 1280x720

CPU 4 Cores 1.6 GHz Cortex-A7

GPU Adreno305

测试样例:

场景中使用6块拼接的平坦的地形对象作为地基,除植被外无其它模型。

中间包含测试植被的地形有4层混合纹理。所有地形PixelError为50。

一个实时方向光,无烘焙光照图。地形开启Shadow,植被未开启。

地形的植被默认可视距离为250。

地形的树木替换为公告板的距离为50。

所有草的纹理为256x256,ARGB,ETC2压缩。

树木的纹理为一张256x128纹理,只有一个材质。

测试报告:

截图为PC编辑器中截取,性能数据为手机获取。

经测试直接修改风力参数为0并不会影响帧率。

稀疏的纹理面片草

视距

三角面数

FPS

Drawcall

Device.PresentCPU耗时(ms)

Render.DrawingCPU耗时(ms)

Render.CullingCPU耗时(ms)

开启地形

250

6.0k

17

284

27.41

17.35

6.24

开启地形

80

5.0k

19

142

36.23

8.80

2.72

关闭地形

250

3.5k

34

279

2.11

16.51

5.86

关闭地形

80

2.4k

48

137

3.56

8.37

2.61

稠密的纹理面片草

视距

三角面数

FPS

Drawcall

Device.PresentCPU耗时(ms)

Render.DrawingCPU耗时(ms)

Render.CullingCPU耗时(ms)

开启地形

250

14.8k

10

694

32.01

40.76

8.38

开启地形

80

6.4k

14

301

41.58

19.34

5.95

关闭地形

250

12.2k

15

689

4.69

40.27

9.45

关闭地形

80

3.9k

24

296

11.91

17.44

4.99

一种模型草326三角面

视距

三角面数

FPS

Drawcall

Device.PresentCPU耗时(ms)

Render.DrawingCPU耗时(ms)

Render.CullingCPU耗时(ms)

开启地形

250

90.2k

13

234

38.83

15.17

7.47

开启地形

80

42.0k

16

112

45.35

7.83

2.96

关闭地形

250

88.2k

23

230

12.28

13.84

6.72

关闭地形

80

39.9k

34

108

11.72

6.94

2.85

两种模型草高草326三角面低草504三角面

视距

三角面数

FPS

Drawcall

Device.PresentCPU耗时(ms)

Render.DrawingCPU耗时(ms)

Render.CullingCPU耗时(ms)

开启地形

250

349.7k

9

594

52.18

37.39

13.40

开启地形

80

175.7k

13

249

49.86

15.72

4.81

关闭地形

250

347.2k

12

589

23.01

34.99

11.83

关闭地形

80

173.2k

21

244

15.93

16.05

5.27

树木模型 308三角面

视距

三角面数

FPS

Drawcall

Device.PresentCPU耗时(ms)

Render.DrawingCPU耗时(ms)

Render.CullingCPU耗时(ms)

开启地形

250

176.6k

12

440

40.04

26.74

8.82

开启地形

80

9.6k

14

29

62.91

2.05

0.95

关闭地形

250

173.5k

15

434

17.72

25.42

8.23

关闭地形

80

6.5k

29

23

27.6

2.10

1.35

以下为将Detail Resolution改为1024,Detail Resolution改为128,即一块地形共8x8=64个植被块的测试结果:

稀疏纹理面片草测试:

基于红米Note1手机的测试结果

视距

三角面数

FPS

Drawcall

Device.PresentCPU耗时(ms)

Render.DrawingCPU耗时(ms)

Render.CullingCPU耗时(ms)

开启地形

250

5.6k

29

19

27.08

1.50

1.03

开启地形

80

5.3k

30

17

27.25

2.21

0.90

关闭地形

250

3.1k

60

14

11.58

1.04

1.01

关闭地形

80

2.8k

60

12

11.80

1.01

0.94

基于红米Note3手机的测试结果

视距

三角面数

FPS

Drawcall

Device.PresentCPU耗时(ms)

Render.DrawingCPU耗时(ms)

Render.CullingCPU耗时(ms)

开启地形

250

5.6k

60

19

9.90

2.10

0.72

开启地形

80

5.3k

60

17

关闭地形

250

3.1k

60

14

9.84

1.30

0.70

关闭地形

80

2.8k

60

12

稠密模型草测试20三角面

基于红米Note1手机的测试结果

视距

三角面数

FPS

Drawcall

Device.PresentCPU耗时(ms)

Render.DrawingCPU耗时(ms)

Render.CullingCPU耗时(ms)

开启地形

250

67.3k

6

28

146.33

2.71

1.38

开启地形

80

40.3k

8

19

116.81

1.44

0.85

关闭地形

250

64.7k

8

23

123.73

1.54

1.50

关闭地形

80

37.7k

10

14

98.46

1.13

0.97

基于红米Note3手机的测试结果

视距

三角面数

FPS

Drawcall

Device.PresentCPU耗时(ms)

Render.DrawingCPU耗时(ms)

Render.CullingCPU耗时(ms)

开启地形

250

67.3k

29

28

26.38

1.89

0.89

开启地形

80

40.3k

33

19

24.20

1.56

0.74

关闭地形

250

64.7k

37

23

18.97

1.59

0.87

关闭地形

80

37.7k

44

14

15.69

1.12

0.70

三、 GPU截帧分析

在绘制稠密纹理面片草时使用Snapdragon Profiler截帧分析调用的OpenGL API:

由API调用分析得出每一个Drawcall只绘制了几片草,因此绘制批次非常多。而不同Drawcall之间并没有切换Shader或纹理,但却使用glUniform4fv函数设置矩阵常量。除此之外每次绘制使用的VertexBuffer和IndexBuffer都是不同的,也没用动态填充顶点数据。怀疑可能Unity的实现并没有将植被的顶点转换到世界空间进行绘制。

四、 性能分析

面数与绘制批次数量:

无论是矩形面片草、模型草,还是模型树,Unity自带的地形植被绘制系统的Drawcall数量都随着顶点数量的提升而大幅增加。而调整视距对可见的三角形数有着非常大的影响,进而会影响同屏的Drawcall数量。但奇怪的是对于树木植被而言,远处的树木应已经由公告板所替代,在不同视距下,不该有如此悬殊的三角面数量差距。

通过对代码的分析,Unity的地形系统有两个参数,分别为Detail Resolution和Detail Resolution Per Patch,如将Detail Resolution设置为1024,Detail Resolution Per Patch设置为8,那么就会将整个地形按照1024/8=128的边长,切分为128x128=16384个小块。对于每一个小块,只要其中包含了任何植被,并且可见,就会合并起来作为一个批次进行绘制。并且不同块之间并不会进行合批。

因此,必须要保证一个地形的块不能太多,否则DrawCall将会非常多。但当区域内植被很密集时,也不适于把块数设置得太少,否则单个块面积太大,不利于不可视裁剪。

CPU与GPU瓶颈:

在Detal Resolution Per Patch较小,Detal分块数量较多时,如果通过视距控制降低三角面和Drawcall数量,可以发现Drawing和Culling的CPU耗时会大幅下降,但Device.Present耗时却相比远视距时不降反增,由此可推论此时的瓶颈已由CPU转向了GPU。对于占据屏幕像素较多的树木测试样例来说尤为明显。

如果将Detail Resolution Per Patch设置得较大,Detail分块较少时,Drawcall数量和CPU相应耗时会大幅减少。通过对不同机型的测试,判断出此时的瓶颈基本都在GPU,主要是顶点和像素计算的负载。

光影效果:

当开启实时光源和植被模型Prefab的投影选项时,会产生额外的深度Pass。

另外在使用Detail Mesh表现草时,并未烘焙出真实的投影效果。

动画效果:

草受风力影响的动画效果在将相关参数改为0时并不能获得任何性能上的提升,可见只是计算数值的变化,而并非没有执行实际的动画计算代码。通过分析代码得出绘制Detail植被的Shader是在源码中写死的,而且都会在VertexShader中执行相同的动画计算函数,且参数和计算稍复杂。后期可以考虑通过修改源码手动控制关闭。

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开源FPGA

FPGA计算3行同列数据之和

实验:FPGA计算3行同列数据之和 实验要求:PC机通过串口发送3行数据(一行有56个数据,3行共有56*3=168个数据)给FPGA,FPGA计算3行同一列数...

1858
来自专栏phodal

为什么JavaScript也将征服VR世界

这篇文章本应该在2个月前就出现了,但是一直都没有足够的动力去写。直到,我最近在玩知乎,也看到了一个类似的问题。加上这是一个无聊的小长假,就把这篇文章写出来。 这...

1678
来自专栏ml

2015编程之美(资格赛)--基站选址

题目3 : 基站选址 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 需要在一个N × M的网格中建立一个通讯基站,通讯基站仅必须建...

3205
来自专栏佳爷的后花媛

如何自制条形码扫描器

在文章之前要先感谢我的老师黄小平先生,在制作这个扫描器期间,给了我们很大的帮助和指导. 先说下这个条形码扫描器的预期功能: 如名称所示,主要达到的功能就是实...

663
来自专栏hightopo

HT for Web自定义3D模型的WebGL应用

1053
来自专栏嵌入式程序猿

嵌入式硬件电路设计基本功

在嵌入式开发领域,软件工程师也要懂硬件,所谓能软能硬才能称霸一方,以下文章转载自嵌入式资讯精选公众号,仅供阅览不代表本平台观点 作者走的电子开发道路其实和大多数...

3696
来自专栏FreeBuf

关于口令强度等级的设计

近来在笔者所参与的一款产品中涉及到口令安全的功能设计,其中一项功能是有关于口令强度的。在设计该功能过程中势必涉及到口令强度的划分设计,怎样的口令...

1889
来自专栏青枫的专栏

DC/DC模块的电源纹波的测量

  事实上,纹波就是一个直流电压中的交流成分。直流电压本来应该是一个固定的值,但是很多时候它是通过交流电压整流、滤波后得来的,由于滤波不干净,就会有剩余的交流成...

571
来自专栏腾讯大讲堂的专栏

如何才能更持久——耗电元凶

题外话: 大多数技术同学都有或多或少的分享过一些电量的心得,特别是那些自己组装个硬件去测电流的牛牛们,更是佩服的五体投地。不过在繁忙的版本迭代和铺天盖地的各种需...

2027
来自专栏AI研习社

如何配置一台适用于深度学习的工作站?

问题详情: 如何配置一台适用于深度学习的工作站? 刚买两块 Titan Z GPU 准备搞搞深度学习,结果原来的工作站功率不够,带不动,所以准备组装一台新工作站...

3538

扫码关注云+社区