• 性能优化-卡牌项目渲染优化


    优化的方向

    CPU

    影响帧率

    GPU

    影响帧率

    内存

    超了会崩

    显存

    显存超了画面会异常,甚至可能导致游戏崩溃

    带宽

    影响耗电

    分辨率

    设备性能不行又要求流畅,降低目标渲染分辨率,立竿见影,但是会牺牲画质

    场景

    1 使用烘焙,减少实时渲染

    2 静态合批,不动的做出Static的物体

    剔除

    1 遮挡剔除:被挡住看不见的就不渲染

    2 视椎体剔除:设置合理的视椎体大小

    3 小对象的剔除:将小对象放入单独一层,并使用 Camera.layerCullDistances 脚本函数设置每层剔除距离

    4 LOD:根据距离显示不同的模型渲染

    角色

    阴影

    1 使用投影做假的阴影

    2 如果是实时阴影,如果不是重点角色,降低阴影质量

    光照

    1 能用光照贴图的地方用贴图,减少计算

    2 反射环境不用实时的,使用环境贴图

    3 非重点角色使用低功耗光照算法

    模型

    减少数据量级

    减少顶点数量、三角面、材质、renderer

    避免接缝

    避免重合的顶点,重合的边

    贴图

    缩小贴图分辨率

    减少贴图数量,小的贴图合并到大的贴图里面。这减少材质数量,可以合批

    质量分级

    根据设备性能加载不同质量的模型

    光照

    减少引起像素光照的光源

    贴图

    1 降低分辨率

    2 使用mipmap,降低带宽和显存占用,但是会增加内存占用

    3 尽可能使用压缩纹理格式,并使用 16 位纹理而非 32 位纹理

    特效

    1 限制粒子数量

    用更少的粒子

    2 质量分级

    根据设备性能使用不同质量的特效,低端机减少氛围粒子,比如火焰爆炸的小火星、烟尘

    3 降低Overdraw

    减小粒子的面积,越大的粒子重叠的越厉害,导致的Overdraw越多

    4 隐藏不必要的特效

    特效数量大的时候距离相机远的受击效果隐藏

    5 尝试使用GPU粒子特效

    有的平台不支持,没有CPU粒子特效稳,但是效率高

    带宽

    1 减少纹理分辨率

    2 减少目标分辨率

    3 使用目标平台最适宜的压缩格式

    4 使用mipmap,如果选择了小分辨率则会降低带宽

    5 使用合适的采样方式,越简单的采样方式性能越好,关注项目中各向异性采样和三线性插值采样,纹理采样会读缓存,如果没读到会往CPU更远的地方读SystemMemory,采样点增加导致cache miss,导致带宽上升

    各向异性采样次数在Unity中设置有1-16,应尽量设置为1;三线性采样采8个顶点,相对于双线性采样是翻倍的

    6 优化顶点带宽,顶点带宽占用比较小,读顶点的带宽值应该占总带宽的10%-20%较为合理

    UI

    1 全屏UI互斥,降低OverDraw

    2 不需要Mask的UI,移除UI中不必要的模板测试代码,需要Mask的UI尽量使用RectMask2D

    3 动静分离解决UI合批问题

    4 使用图集,某个UI界面使用的图片放到一个图集

    5 UI上去掉不必要的Raycast Target

    shader代码

    结构优化

    减少pass,避免使用多pass的shader

    质量分级

    根据设备性能使用不同的算法

    在顶点着色器计算代替在像素着色器计算
    shader lod技术

    只有shader的LOD值小于某个设定的值,这个shader才会被使用,而使用了那些超过设定值的shader的物体将不会被渲染

    减少耗时的运算

    三角函数,指数

    精度优化

    float/highp:顶点坐标

    half/mediump:标量、纹理坐标

    fixed/lowp:颜色和归一化后端方向矢量

    插值优化

    uv1, uv2打包到一个half4进行插值

    vec2 a, vec2 b打包到一个vec4中进行插值

    移动平台敏感操作

    Alpha 测试、颜色遮罩 (Color Mask)可能是资源密集型的操作,能不用就不用

    后处理

    取舍,减少后处理

    合并后处理,在一个shader里完成多个后处理效果

    合批

    SRP Batch:合并相同shader变体,把数据一次性传入gpu,减少对属性的设置,只需要绑定已经传进gpu的数据

    Static batching:将静态物体合并为一个大网格,从而以更快的速度渲染它们。不会减少DrawCall,但是会让CPU在“设置渲染状态-提交Draw Call”上更高效

    GPU Instancing:同一Mesh和同一Material

    Dynamic Batching:是为过去的低端设备设计的。在如今的电子设备上,动态批处理产生的CPU开销反而有可能大于DrawCall的开销,影响性能。

    合批优化项冲突时生效优先级

    优先级冲突:SRP Batcher|Static Batching > GPU Instancing > Dynamic Batching(4)

    工具

    Statistics窗口,查看性能指标和耗时

    Profile窗口,查看耗时

    FrameDebuger,查看渲染过场

    小结

    卡牌项目渲染方面优化的重点在场景、角色、特效。需要烘焙场景,使用烘焙好的光照贴图,优化模型制作、特效制作。

    角色模型的面部、影响身材的网格、影响气质的衣服可以做的精细,不重要的地方可以降低质量,达成好钢用在刀刃上的目的。

    每个项目要求不同,灵活应对。

    参考资料

    https://docs.unity3d.com/cn/2020.2/Manual/OptimizingGraphicsPerformance.html

    https://zhuanlan.zhihu.com/p/523702434

    https://imgtec.eetrend.com/blog/2020/100050575.html

  • 相关阅读:
    【VUE】vue程序设计----模仿菜谱做菜网站
    java面试题整理《微服务篇》六
    打开cmd的方式和常用Dos命令
    ES6 特性
    【飞控开发高级教程7】疯壳·开源编队无人机-编队飞行
    展讯多语言支持列表
    C语言高级教程-C语言数组(二)
    LeetCode每日一题(2012. Sum of Beauty in the Array)
    Flink中的时间和窗口 完整使用 (第六章)
    Android与H5交互 -- 点击H5跳转到 Android原生 页面
  • 原文地址:https://blog.csdn.net/ak47007tiger/article/details/136539775