费用:
19美金/每月
功能:
易用且表现自然的内嵌植被枝干及树叶编辑功能
自动生成随机变形模型
不同植被模型LOD切换(远处生成公告板)
投影及环境遮挡效果
未确认的功能:
光照图支持程度
植被自适应地形颜色
功能:
使用树干/树叶节点程序化自动生成树木模型(效果不是很自然)
支持环境遮挡
较难控制模型面数
树干树叶需使用不同的材质
功能:
将树木模型刷到地形上(要求树木Prefab的MeshRenderer必须在根节点上,且只有一个。)
自动合批绘制
自动生成公告板用于在远处显示(要求必须使用特定的植被Shader)
支持碰撞体
随机变化高度
随机变化颜色
不支持的功能:
不同模型LOD切换
植被自适应地形颜色
功能:
将草的模型刷到地形上(要求树木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 |
在绘制稠密纹理面片草时使用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 删除。