前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity5 植被系统分析

Unity5 植被系统分析

原创
作者头像
李海辰
修改2017-11-17 18:03:39
2.3K0
修改2017-11-17 18:03:39
举报
文章被收录于专栏:李海辰的专栏李海辰的专栏

一、 功能分析

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中执行相同的动画计算函数,且参数和计算稍复杂。后期可以考虑通过修改源码手动控制关闭。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、 功能分析
    • 1. SpeedTree for Unity5
      • 2. TreeCreator in Unity
        • 3. Tree Brush in Terrain
          • 4. Grass Mesh and Texture in Terrain
          • 二、 性能测试
          • 三、 GPU截帧分析
          • 四、 性能分析
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档