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 条评论
登录 后参与评论

相关文章

来自专栏点滴积累

geotrellis使用(二十七)栅格数据色彩渲染

目录 前言 复杂原因及思路分析 实现过程 总结 一、前言        今天我们来研究一下这个看似简单的问题,在地理信息系统中颜色渲染应当是最基本的操作和功能,...

3745
来自专栏机器人网

PID控制原理:看完这三个故事,你就明白了

一、PID的故事 小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸...

2623
来自专栏CreateAMind

图片语义级属性轻松改变

论文: Deep Feature Interpolation for Image Content Changes

843
来自专栏算法+

WebRTC 音频采样算法 附完整C++示例代码

之前有大概介绍了音频采样相关的思路,详情见《简洁明了的插值音频重采样算法例子 (附完整C代码)》。 音频方面的开源项目很多很多。 最知名的莫过于谷歌开源的Web...

7646
来自专栏CDA数据分析师

7 款 Python 数据图表工具的比较

Python 的科学栈相当成熟,各种应用场景都有相关的模块,包括机器学习和数据分析。数据可视化是发现数据和展示结果的重要一环,只不过过去以来,相对于 R 这样的...

27410
来自专栏计算机视觉与深度学习基础

HDU4832

由于水平和竖直相互独立,所以可以分开计数,最后再用组合数算一下,万年老坑long long #include<cstdio> #include<iostream...

19210
来自专栏机器人网

PID控制原理:看完这个故事你就明白了

小明接到这样一个任务:有一个水缸漏水,且漏水的速度是不定的,但要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水。 ? 开始小明用瓢加水...

3235
来自专栏MelonTeam专栏

Core ML and Vision Framework on iOS 11

导语 :机器学习和计算机视觉在 iOS 上虽然早已有了系统级的支持,但 WWDC 17 发布的 iOS 11 将它们的使用门槛大大降低。苹果提供了设计合理且容...

2415
来自专栏分子生物和分子模拟计算

同源建模

942
来自专栏技术专栏

自己实现一个滑动窗口

上述计算中的alpha的值是一个0~1之间的常量,aplha值决定了一段时间内的平滑水平,alpha越趋于1,历史值对当前的平均值的影响越大,反之亦然

511

扫码关注云+社区