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

Unity | 性能优化

目录

一、总结Unity开发中耗时高的操作

1.资源及UI

2.场景设置

3.代码

二、堆内存

1.累积分析

(1)常见的会引起堆内存累积的Unity API:

(2)常见的会引起堆内存累积的System操作

(3)其他

2.泄露分析

三、CPU

1.瓶颈函数优化

(1)明显造成耗时的函数

(2)稍明显耗时函数

2.高频函数优化

(1)对于多个高频Update

(2)针对低频逻辑,轮循式改为事件队列

(3)针对高频逻辑,将高频访问的属性分离到单独的Array中

3.IL2CPP


一、总结Unity开发中耗时高的操作

1.资源及UI

  • 一般来说,纹理尺寸越大,占用的内存也就越大,一般情况我们推荐纹理尺寸为 512*512,如果 512*512 显示效果已经够用,那么就不要用 1024*1024 的纹理,因为后者的内存占用是前者的 4 倍。
  • 文本使用 Outline 效果会增加 4 倍的顶点数,造成较高的重建开销,可尝试用 shadow 替代。
  • 图片RGB32、RGB24 等非压缩格式的纹理占用内存较大,建议尽可能使用硬件支持的压缩纹理格式。
  • 图片Wrapmode 使用了 Repeat 模式,容易导致贴图边缘出现杂色。
  • 音频源文件为双声道且没有开启Force To Mono。在Android设备上,双声道音频意义不大,但是会占用双倍内存,建议使用单声道。
  • 音频文件Streaming 选项开启后,音频加载方式变为边播放边读取,会明显降低内存占用,一般建议背景音乐使用这种方式。
  • Read/Write 选项启用后,将会允许从脚本来访问网格数据,同时会产生网格数据的副本,占用额外内存,等同于一个网格数据会有接近2倍的内存消耗。但是对于需要使用StaticBatchingUtility.Combine进行合批的Mesh,以及部分Unity版本中粒子系统里使用到的Mesh,仍需要开启Mesh的Read/Write选项。
  • Mipmap开启后,内存会是未开启 Mipmap 的 1.33 倍,因为 Mipmap 会生成一组长宽依次减少一倍的纹理序列,一直生成到 1*1。 Mipmap 提升 GPU 效率,一般用于 3D 场景或角色,UI 不建议开启。
  • Tiled 模式的 Image 组件可能产生过多的面片。
  • 不建议使用面片数超过 500 的网格。
  • 粒子系统的Prewarm操作会在使用时的第一帧中造成相对集中的CPU耗时,很可能会造成运行时局部卡顿,建议考虑是否确实需要开启该选项,如果可以不用则将其关闭。
  • 粒子系统:不建议使用尺寸过大(256)的纹理。
  • 粒子系统建议不要开启Collison或Trigger功能,否则会有较高的物理开销。
  • ApplyRootMotion勾选后,更新动画时会将Root的运动信息应用到Animator所在的 GameObject上,会有一定的开销。一般对于主玩家这样的物体,要用动画控制人物前进 的情况下需要开启ApplyRootMotion,否则建议在ImportSettings中将动画的"Root Motion"bake到曲线中,并取消勾选ApplyRootMotion。
  • alpha=0, 且对应的Canvas Renderer组件没有开启Cull Transparent Mesh 的 Image 组件依然会参与渲染,建议进行排除。
  • Canvas下UI节点太多,会导致加载及UI重建耗时。

2.场景设置

  • 开启雾的效果,GPU 消耗提高。
  • MeshCollider 的开销较高,建议替换为简单碰撞体来简化物理碰撞的开销。
  • 接收音频的组件AudioListener正常情况只放一个。
  • Unity中开启了阴影的实时光照会对所有设置了cast shadow 的object进行实时阴 影渲染,使用forward rendering对每一个开启阴影的实时光照都会产生大量的渲染消 耗。通常推荐场景中只存在1个开启了shadow的实时光照,如需要多个光照,建议关闭 其他光照的阴影渲染。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【分享】格力手机色界G0245D 刷REC、root、 救砖、第三方rom教程和资源
  • 论文辅导 | 基于改进灰色预测模型的港口物流需求预测研究
  • opencv图像基本操作
  • [MRCTF2020]套娃1
  • 实验五之用Processing绘画
  • 洛谷p4018题解
  • GAMES104:07游戏中渲染管线、后处理和其他的一切-学习笔记
  • 【运维】从一个git库迁移到另一个库
  • 【设计模式】工厂模式和抽象工厂模式
  • 2020 位示图
  • 十五、OpenCVSharp实现相机标定
  • 关于栈(顺序栈)的知识讲解
  • 使用AWS Lambda轻松开启Amazon Rekognition之旅
  • 如何在C++ QT 程序中集成cef3开源浏览器组件去显示网页?
  • 加解密:一文搞懂对称加密与非对称加密
  • 分享的文章《人生如棋》
  • 【前端学习】-粗谈选择器
  • 78. Subsets
  • Nodejs和JavaWeb协助开发
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Yeoman_Bower_Grunt
  • 多线程 start 和 run 方法到底有什么区别?
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端性能优化--懒加载和预加载
  • 微信小程序开发问题汇总
  • 为视图添加丝滑的水波纹
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • #define,static,const,三种常量的区别
  • #Z2294. 打印树的直径
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (003)SlickEdit Unity的补全
  • (02)Hive SQL编译成MapReduce任务的过程
  • (7) cmake 编译C++程序(二)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (javascript)再说document.body.scrollTop的使用问题
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (一)Dubbo快速入门、介绍、使用
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET 依赖注入和配置系统
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .NET建议使用的大小写命名原则
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .Net组件程序设计之线程、并发管理(一)
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [.net] 如何在mail的加入正文显示图片
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [ACTF2020 新生赛]Include
  • [AR Foundation] 人脸检测的流程
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [C#7] 1.Tuples(元组)