当前位置: 首页 > news >正文

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

优化的方向

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

相关文章:

  • QML | 在QML中导入JavaScript资源、导入JavaScript资源、包含一个JavaScript 资源
  • 机器学习之分类回归模型(决策数、随机森林)
  • 如何使用宝塔面板搭建Discuz并结合cpolar实现远程访问本地论坛
  • Qt: 事件过滤器的更多用法
  • Echarts 报提示 There is a chart instance already initialized on the dom.
  • docker的快速入门教程
  • excel 动态列导出
  • docker离线搭建仓库
  • 用A*算法求解八数码问题
  • 【C++】STL(二) string容器
  • SpringBoot中定时任务、corn表达式
  • Oracle 的同义词(Synonym) 作用
  • 加速你的应用:探索Redis的极致性能与多样化应用
  • 客户案例|100M 768 维向量数据,Zilliz Cloud 稳定支持 Shulex VOC 业
  • Java基于SpringBoot+Vue的人事管理系统,附源码
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 77. Combinations
  • Twitter赢在开放,三年创造奇迹
  • windows下使用nginx调试简介
  • 百度地图API标注+时间轴组件
  • 第十八天-企业应用架构模式-基本模式
  • 基于HAProxy的高性能缓存服务器nuster
  • 简单易用的leetcode开发测试工具(npm)
  • 手写双向链表LinkedList的几个常用功能
  • 一份游戏开发学习路线
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • AI算硅基生命吗,为什么?
  • python最赚钱的4个方向,你最心动的是哪个?
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • # include “ “ 和 # include < >两者的区别
  • #大学#套接字
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $.ajax()方法详解
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (六)激光线扫描-三维重建
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一一四)第九章编程练习
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)nsfocus-绿盟科技笔试题目
  • (转)详解PHP处理密码的几种方式
  • (转)一些感悟
  • .net core 6 集成和使用 mongodb
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net反编译的九款神器
  • .sdf和.msp文件读取
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)