Unity 性能优化总结

影响性能的因素

造成游戏性能瓶颈的主要原因分成以下几个方面:
(1)CPU
1.过多的 draw call
2.复杂的脚本或者物理模拟
(2)GPU
1.顶点处理
过多的顶点、过多的逐顶点计算
2.片元处理
过多的片元(既可能是由于分辨率造成的,也可能由于overdraw 造成的)、过多的逐片元计算。
(3)带宽
1.使用了尺寸很大且未压缩的纹理
2.分辨率过高的帧缓存

针对上面的内容会涉及的优化技术:
(1)CPU 优化
1.使用批处理技术减少 draw call 数目
(2)GPU 优化
1.减少需要处理的顶点数目
优化几何体、使用LOD及遮挡剔除
2. 减少需要处理的片元数目
控制绘制顺序、警惕透明物体、减少实时光照
3. 减少计算复杂度
使用Shader的LOD技术、代码方面的优化
(3)节省内存带宽
1.减少纹理大小
2.利用分辨率缩放

可以利用Unity提供的一些渲染分析工具来实现

一、综合优化

1、降低屏幕分辨率尤其是在android平台对性能提升很大。可以有效缓解gpu的压力。

2、做好资源异步加载,实现一个实例化队列,可以很大程度上减少卡顿。

3、做好超量的模型和特效屏蔽,可以有效减轻cpu压力。

4、善用工具。比如Unity Profiler、Snapdragon Profiler等,针对性的对性能瓶颈进行优化。

5、玩家头顶血条的HUD要使用3D的,而不是UGUI。否则同屏玩家数量很多的时候Mesh合并开销很大。

6、UI上使用TextMeshPro。可以很大程度上缓解UI打开卡顿的问题。描边、阴影开销很低。

7、控制帧率。现在高刷新率的手机非常多。不要直接使用VSyncCount控制帧率了。否则在120hz刷新率的手机上vSyncCount=1会有120fps的帧率。直接使用targetFrameRate=30来设置帧率。

8、利用分辨率缩放,具体可参考设置屏幕分辨率

二、优化的经验

(一) UI的性能优化

1、每个图片材质都会产生一个dc, 只有通过打包图集,才能合并dc,。同个图集内的图片,dc都为1。不同图集渲染顺序的交叉会产生额外dc,所以界面尽量按图集整理UI顺序

2、实现一个高效率的 FindChlid 函数。因为在写UI的时候查询控件对象是非常常见的操作。如果不做优化,使用 gameObject.name == “xxx” 来做比对的话,可能会产生很多的GCAlloc。

3、血条的减少动画之前是Image和DOTween来实现的。后面修改为shader实现。(坐标计算)

4、小地图用shader实现指定位置的图片渲染,而不是RectMask2D,可以减少overdraw。因为RectMask2D是使用alpha=0来实现裁剪的。

5、小地图的玩家标识,聊天界面,都添加Canvas,目的是动静分离。

6、UGUI的合批规则是自动计算元素的层级。先排除掉active=false,使用scale=0或Canvas Group=0

(二) 场景的性能优化

1、要勾选StaticBatch,但是不能滥用有color、uv3的,顶点超过4000个以上的,数量超多,但是同屏显示不多的模型。这些都不应该勾选StaticBatch。否则会导致包体积明显增大。因为StaticBatch会把模型都build到场景的ab包内。

2、避免模型和贴图勾选 readable选项。这个可以在模型和纹理导入的时候做设置。

3、对于多个模型使用共享材质,应用Renderer.shareMaterial 来保证修改的是和其他物体共享的材质,

4、使用动态批处理时需注意顶点属性规模(超900顶点)、保证指向光照纹理中的同个位置、多Pass的shader会中断批处理(前向渲染中,需要使用额外的Pass为模型添加更多的光照,确保模型不会被动态批处理)

(三) 一般优化

1、按ID寻址属性。比如 Animator、Shader都有对应的接口。Animator.StringToHash。Shader.PropertyToID。

2、减少矢量和四元数的数学计算。控制运算顺序。尽可能不要使用分支语句和循环语句

3、隐形颜色字符串转换的时候 (#RRGGBBAA),使用一个 ColorUtility 的API会更加高效,且可以避免GCAlloc。

4、调试代码可以增加 [Conditional(“DEBUG”)] 这样的标签。防止开发版本的代码或者日志发布出去。频繁打Log会对性能有严重影响。

5、对象的Update放到统一的管理器或主线程里面进行更新。

6.、避免使用昂贵的数学函数。比如 pow exp log cos sin tan 等。可使用查找表来作为替代

7、运用对象池,避免重复实例化、分帧运算,避免短时超负荷、数据缓存,避免重复运算及算法

(四) Shader的性能优化经验

1、尽可能减少纹理采样数目,控制绘制顺序、时刻警惕透明物体、减少实时光照和阴影

2、优先使用低精度的数字格式。优先使用half。在现代gpu上fixed等同于half。 部分对精度有特殊需求的情况下才使用float。个别情况下,尤其是与法线相关的时候,使用half容易因为精度不足导致渲染结果错误,这个时候还是应该使用float。

总结

1、CPU

运用对象池,避免重复实例化
分帧运算,避免短时超负荷
数据缓存,避免重复运算
算法

2、 GPU

使用多层次细节LOD
使用光照贴图
静态合批和动态合批
简化着色器
使用平台推荐的压缩格式
减少模型面数
减少贴图大小

3、内存

模型区分高低模
释放AssetBundle
降低模型面数
降低骨骼数量
降低贴图大小

4、 包体

压缩图片
压缩音频
压缩自带库文件
分段下载
字体裁剪

5、 网络

使用压缩性高的通讯协议
数据流量优化

  • 22
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity是一种用于创建3D和2D游戏的跨平台游戏引擎。机械结构是指由不同部件组成的机械装置或机械系统。Unity机械结构是指使用Unity引擎进行机械结构模拟和仿真的能力和方法。 使用Unity进行机械结构建模和仿真可以带来很多好处。首先,Unity具有强大的3D建模能力,可以方便地创建各种机械部件和装置的模型,并对其进行渲染和显示。这使得工程师能够通过虚拟实验来评估机械结构的性能和可靠性,而无需进行实际的物理实验。这样可以节省时间和成本,并提高设计的效率。 其次,Unity具有物理引擎,可以模拟和仿真机械结构的行为。例如,工程师可以通过在Unity中设置物体的质量、碰撞形状和力的作用方式等参数,来模拟机械结构的运动和相互作用。这使得工程师能够更好地理解机械结构的行为,并进行优化和改进。 此外,Unity还具有编程和脚本功能,可以用于控制和自动化机械结构的运行。工程师可以使用C#或Unity脚本语言编写程序,来实现机械结构的运动控制、路径规划和逻辑控制等功能。这使得工程师能够更灵活地控制机械结构,并实现更复杂的功能。 总结起来,Unity机械结构是指利用Unity引擎进行机械结构建模和仿真的能力和方法。通过使用Unity,工程师可以快速创建机械结构模型、进行仿真分析、优化设计,并实现控制和自动化。这将提高机械结构设计的效率和精度,并为工程师提供更多创新和优化的可能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值