第六章动态图形
渲染性能的增强
1启用禁用GPU SKinning
骨骼位置变化网格顶点的过程,该顶点处理任务可以在GPU上执行,也可以CPU,这个取决于上面的参数
2.降低几何复杂度
减少网格的顶点年属性,网格包含大量不必要的uv和法线数据
3种解决办法
- 美术手动调整,生存多边形书更少的网格,网格抽取工具简化网格
- 简单从场景中移除网格,这是最后的手段
- 实现网格的自动剔除特效,如LOD等技术
3.减少曲面细分 改进曲面细分算法活减轻其他前端任务的负载
4.应用GPU实例化 一般是创建大量item时使用
具体可以看官网文章:GPU 实例化 - Unity 手册
5.LOD 会占用一定内存,配合美术和关卡配置一起跳转,要避免预先优化,一般游戏是在RTS和moba中,剔除租
6.使用遮挡剔除
staicFlag下拉列表正确标记为Occluder static
7.优化粒子系统
使用粒子删除系统
避免粒子系统的递归调用
粒子系统api还有start,stop,pause ,clear等api这些方法都有一个默认的true的withChildren从参数,禁用调用递归等
缓存粒子系统组件,并手手动迭代他们
8.优化unityUI
使用更多的画布
动静分离
为无交互的元素禁用Raycast Target
禁用父画布组件来隐藏ui元素
避免Animator组件
为worldspace画布显示定义EventCamera
不要使用alpha隐藏ui元素
优化ScrollRect 确保使用RectMask2D,禁用pixel perfect ,手动停用ScrollRect活动
使用空的uiText元素进行全屏交互,创建一个没有定义字体或文本的UIText元素,不需要生成任何渲染信息的元素,只处理边界框的交互检查
6.3.9 着色器优化
1.考虑使用户移动平台的着色器
使用小的数据类型 32位浮点调整为16位浮点
3.重排时避免修改精度 精度类型转换是非常耗时 ,一开始统一精度,或者使用高精度
4.使用GPU优化的辅助函数 意思是不要自己写一些算法库,能用框架里的用框架里
5.禁用不需要的特性,比如找色器徐亚哦透明度,z写入,aplha测试活着混合嘛
6.删除不必要的输入数据 一些着色器多余数据
7.只公开所需的变量
8.减少数学计算的复杂度 比如sin和cos提前算好,利用平方代替开方等
9.减少纹理采样
纹理采样是内存宽带的核心开销
10.避免条件语句
11.减少数据依赖 避免强依赖
float sum = input.color1.r; sum = sum + input.color2.g; sum = sum + input.color3.b; sum = sum + input.color4.a; float result = calculateSomething(sum); 代码对比 float sum1, sum2, sum3, sum4; sum1 = input.color1.r; sum2 = input.color2.g; sum3 = input.color3.b; sum4 = input.color4.a; float sum = sum1 + sum2 + sum3 + sum4; float result = CalculateSomething(sum);
6.3.12 最小化纹理交换
6.3.13 VRAM限制
用隐藏的Gameobject预加载纹理
避免纹理抖动
6.3.14 照明优化
1.1谨慎使用实时阴影
1.2使用剔除遮罩 CullingMask
1.3使用烘焙的光照纹理 LightMapping
6.3.15优化移动设备的渲染性能
- 避免alpha测试,消耗资源,利用alpha混叠来避免
- 最小化drawcall
- 最小化材质数量
- 最小化纹理大小 1024*1024
- 确保纹理是方形且大小为2的幂次方
- 着色器尽可能使用最低的精度格式