Unity性能优化(散记、持续更新)

Unity 热更新 HybridCLR 对接到项目中 到这里,我们没有重新发布工程,就可以更新程序集里逻辑(看到了我们修改后的日志信息),说明我们热更新(HybridCLR)成功了。 1.在HybridCLR示例项目中,Main程序集是源工程,没有加入到热更新里,所以在Mian程序集里的代码逻辑是不能热更新的,这也是一个项目框架设计时要注意的,因为Mian程序集中有LoadDll. cs,在这里处理的热更新程序集的加载,所以这里的变动会直接影响到后续是否要重新打包。 LInkXml: 生成LInkxml文件(这里记录了项目中所有用到的基础程序集-(Sys 阅读详情

检测工具:Unity Profiler或者是Profile Analyzer

注意:

  1. 尽早的进行性能分析,从开发初期便时刻关注

  1. 优化不要胡乱进行,配合工具找到准确的原因对症下药

  1. 完成编辑器的优化后,还需在实际运行环境或者最低规格设备环境上进行性能分析

内存-减少GC的影响:

  1. 减少不必要的字符串创建和操作,避免解析基于字符串的数据文件,如:json和xml;改用 ScriptableObject 或 MessagePack、Protobuf 等格式存储数据,字符串可使用StringBuilder替代

  1. 缓存数组引用,不要在循环中分配数组,使用某些避免产生垃圾的函数

  1. 缓存并重用 WaitForSeconds 对象,而不要在 yield 行中创建它,创建新的WaitForSeconds对象会产生垃圾

  1. 请避免使用 LINQ 和正则表达式

  1. 避免拆装箱操作

如果有可能,可以定时收集垃圾System.GC.Collect

使用增量式垃圾收集器拆分GC工作负载Editor-Project Settings-Player-Other Settings-

Use incremental GC

尽可能减少每帧运行的代码,不必要每帧运行的代码移出Update、 LateUpdate 和 FixedUpdate或者每N帧执行一次

避免在Awake\OnEnable\Start中处理复杂的逻辑

避免空unity事件,把脚本中空的Update或者LateUpdate删除

发布前删除或者禁用所有的调试日志语句

不使用字符串名称对 Animator、Material 和 Shader 属性进行内部寻址。为了加快速度,所有属性名称都经过哈希处理为属性 ID,实际上是这些 ID 用于寻址属性

避免在运行时去添加组件

GameObject.Find、GameObject.GetComponent 和 Camera.main( 在 2020.2之前的版本中)可能开销较大,应避免在 Update 方法中调用它们。而应在 Start 中调用它们,并且缓存相应结果

考虑使用对象池

使用ScriptableObject,数据复用、配置文件、编辑器下数据持久性

降低或者禁用Accelerometer Frequency

禁用不必要的Player或Quality设置,禁用不必要的物理设置

避免使用过多层级

正确导入纹理:

  1. 减少Max Size

  1. 正确的压缩格式

  1. 制作图集

  1. 关闭Read/Write Enable

  1. 禁用不必要Mip Map

正确导入网格:

  1. 适合的模型压缩级别

  1. 禁用Read\Write Enable

  1. 禁用骨骼和BlendShape

  1. 尽可能禁用法线和切线

使用可寻址资源系统Addressables

动态批处理,勾选Project Settings-Player-Dynamic Batching,仅支持顶点数小于900的网格物体,限制较多并且会浪费CPU去查找需处理的小网格

静态批处理,对于不移动物体使用,但需使用更多内存

GPU实例化,需材质支持,使用硬件进行有效批处理

SRP批处理,材质可以不同,但shader需要一样。项目使用脚本化渲染管道(SRP)

避免过多的动态光照,多考虑光照探针和烘培光照

禁用阴影,采用纹理伪阴影

对移动物体使用光照探针

使用LOD

使用遮挡剔除来移除隐藏的对象,将对象标记为静态遮挡物或被遮挡物,然后通过 Window > Rendering > Occlusion Culling 对话框进行烘焙

多个相机时,要进行合适的限制

避免绘制不必要的透明或半透明图像

限制后期处理效果

优化SkinnedMeshRenderer确保每一个使用SkinnedMeshRenderer的对象都是需要它的

尽可能减少反射探针

划分画布,将常更新的UI内容和不常更新的UI内容做画布区分

隐藏和禁用不可见的UI元素(组件),在需要时再显示

将GraphicRaycaster用到需要使用点击的UI上,移除顶层的点击组件

在所有不需要 Raycast Target 的 UI 文本和图像上将其禁用

尽量避免使用布局组(Layout Group)

避免使用大型列表和网格视图,可考虑UI元素池

UI全屏遮挡时可以禁用摄像机对3D场景的渲染

确认是使用通用骨架还是人形骨架,如果非必要,最好使用通用骨架

避免过多使用Animator

PlayerSettings-Prebake Collision Meshes勾选上,用构建的时间换运行时的性能

请务必同时编辑 Physics 设置 (Project Settings > Physics)。尽可能简化 Layer Collision Matrix。

禁用 Auto Sync Transforms 并启用 Reuse Collision Callbacks。

使用类方法(如 MovePosition 或 AddForce)来移动 Rigidbody 对象。直接转换其 Transform 组件可能导致重新计算物理世界,在复杂场景中,这样需要较大开销。

在 FixedUpdate 中而不是 Update 中移动物理体。

Unity3d移动端性能优化 以下条目主要针对移动端,大部分也适合PC端 一、Profiler的使用 1.性能优化应贯穿项目开发的全过程,如需求(性能能不能达到要求)、设计、开发、测试等。不能开发结束才优化性能。 2.官方推荐的优化工具是【Window】->【Profiler】 3.确认瓶颈是CPU-bound(Gfx.WaitForCommands)还是CPU-bound(Gfx.WaitForPresent) 4.内存分析使用Memory Profiler 二、内存优作 5.减少内存收集的影... 阅读详情

相关推荐

Unity跨平台开发指南(PC/VR/Android/WebGL)

Unity跨平台项目配置指南

leikang111的博客 4969

unity 增量式GC

为什么使用增量式垃圾回收 C#语言使用托管内存和自动垃圾回收,这意味着它使用自动化方法跟踪内存中的对象,然后释放不再使用对象的内存。 这种做法的优点是,开发者不必手动跟踪释放不需要的内存,因为垃圾回收器会自动执行此操作,这样会使开发者的工作更轻松,同时避免出现潜在Bug。缺点是垃圾回收器需要一些时间完成工作,而开发者或许不希望将特定时间用于此处。 Unity使用的是贝姆垃圾回收器(Boehm–Demers–Weiser garbage collector),该回收器利用了Stop-The-World机制,这

Morris-w的专栏 6974

【U3D性能优化教程——Mono内存篇】之五:Unity19最新功能:Incremental Garbage Collection(全网首发)

      本文由@唐三十胖子出品,转载请注明出处。  文章链接:https://blog.youkuaiyun.com/iceSony/article/details/86306080       这篇文章由唐三胖ヾ(•ω•`)o网络整理总结,针对Mono概念的系列优化教程。 通过这篇文章,你可以知道 1)最新的GC回收机制 1.背景介绍 在Unity19版本前,Unity使...

唐三十胖子的博客 2447

Unity优化——脚本优化策略4

在前面我们讨论了使用这些Unity Engine特性来避免在大多数帧中出现过多CPU工作负载的优缺点。不管采用哪种方法,都存在一个额外的风险,即需要编写大量的MonoBehaviour来定期调用某个函数,这意味着在同一帧中同时触发了太多的方法。想象一下,成千上万的MonoBehaviour在场景开始时一起初始化,每个MonoBehaviour同时启动一个协程,每500毫秒处理一次AI任务。

m0_63024355的博客 1611

Unity3D性能优化 - Update() 的使用

个人认为在脚本方面采用面向对象的调用开发,每次在Update里面写代码的时候,你要考虑,是否值得这么做,因为我们都知道update是每一侦都会执行的,那么如果有些代码并不是每次都需要调用的,你就不应该放到update里面检测某个条件成立,然后再执行,这样就类似C语言的过程式编程了。 不知道大家是否完全了解了官方这里http://docs.unity3d.com/Documentation/Scr

Chiuan的专栏 1万+

优化Unity3D中Update方法的帧率执行方法以节约资源

通过将Update方法中的逻辑代码放到一个协程中,并使用yield return new WaitForSeconds(timeInterval)来控制协程的执行频率,可以有效地降低Update方法的执行次数。在Unity3D中,Update方法是常用的游戏循环函数之一,它在每一帧中执行,用于更新游戏对象的状态。通过判断累计的时间是否超过设定的时间间隔,可以控制Update方法中代码的执行。在Update方法中,累计时间超过设定的时间间隔时,执行逻辑代码,并将累计时间减去时间间隔。

VspAnaconda的博客 764

Unity 之 打包参数 -- Player面板属性详解

Unity Project Setting Player面板详解,看完这篇文章,彻底搞懂各个选项设置实际作用。

陈言必行 -- Unity游戏开发领域优质博主 1万+

基于OkHttp3+Retrofit2+RxJava3搭建响应式网络框架

本文介绍了一个基于OkHttp3+Retrofit3+RxJava3的响应式网络框架设计。该框架采用分层架构,OkHttp3负责底层网络请求,Retrofit3封装HTTP接口,RxJava3实现响应式流处理。核心亮点包括:1)高度解耦的分层设计;2)统一的异常处理和响应体封装;3)RxJava3实现线程切换和请求管理;4)MVVM架构适配,业务层只需关注数据逻辑。框架提供了完整的实现方案,包括全局配置、拦截器、响应转换、接口声明、仓库封装等组件,并支持生产环境扩展功能如Cookie持久化、Token刷新等

fuge2008的博客 872

GC 增量式垃圾回收

增量式垃圾回收(Incremental GC)是一种通过逐渐推进垃圾回收来控制 mutator 最大暂停时间的方法。 通常的 GC 处理很繁重,一旦 GC 开始执行,不过多久 mutator 就没法执行了,这是常有的事。也就是说,GC 本来是从事幕后工作的,可是它却一下子嚣张起来,害得 mutator 这个主角都没法发挥作用了。我们将像这样的在执行时害得 mutator 完全停止运行的 GC 叫作...

勿忘初心 2666

手把手教会你用yolov8从环境配置到检测任务实战

做本文章前,我浏览过很多网上资料,我发现他们总是写的含糊不清,而且实际操作起来就会有各种各样的问题,要么就是根本不适合一些小白,所以我在这里写一篇完全针对小白的yolo从入门到实战。看完本文章后大家都可以实现下图效果,数字识别是一种比较简单的检测任务,其他识别任务学完本例也能够一通百通,大家边做边学,更好的体会yolo的神奇之处。

KevenDuan的博客 2871

echarts实现折线图上下限区域展示

效果图: 画这种区域中主要是利用了series的两个属性: 思路:上下限都画上区域,然后折线利用图形透明度隐藏,给上区域加上颜色,给下区域加上白色(echarts图背景是啥色,就加啥色) lineStyle: { opacity: 0 }, // 图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形 areaStyle: { color: 'rgba(0,122,255,0.1)' }, // 填充的颜色 我的需求是最大天数、最小天数、

小太阳的博客 1万+

Unity Update优化

测试一下MonoBehaviour自己的Update函数调用消耗创建20000个物体,每个物体上挂载一个带有MonoBehaviour自己的Update,脚本如下:public class TestUpdate1 : MonoBehaviour { private void Update() { float a = 1.513f + 1.5141f;

那就做游戏 5233

EM4095低频RFID曼彻斯特解码实战:从原理图到MCU代码实现

本文详细介绍了EM4095低频RFID读卡器的设计与实现,从芯片工作原理、天线设计到曼彻斯特解码算法。重点讲解了基于STM32的MCU代码实现,包括定时器捕获、数字滤波和错误处理,为开发125kHz RFID系统提供实用指南。

oil88的博客 715

性能优化:自定义Update层

我们知道尽量少在MonoBehaviour脚本的Update回调中处理逻辑,对游戏性能影响比较大。但是有些逻辑又必须写在Update中,比如游戏AI模块,或子系统更新等。更糟糕的是,如果又要求当前场景中有成千上万的NPC敌人在场时,如果每个NPC都有Update回调都执行的话,而且它们极有可能在同一帧触发,这会产生一个巨大的CPU使用峰值。Unity调用Update时,会经历本机-托管桥接,而这是非常耗性能的。换句话来讲,执行10000个Update()回调要比在执行1个Update回调但执行10000个“

成长ing中的w的专栏 775

【车辆动力学】专栏目录汇总

车辆动力学知识目录汇总

CrazyRabbit的博客 1713

零基础搭建本地AI绘画环境:Stable Diffusion 3.5保姆级安装教程(含中文优化方案)

本文提供零基础搭建本地AI绘画环境的详细教程,重点介绍Stable Diffusion 3.5的安装与中文优化方案。从硬件配置检查到软件依赖安装,再到核心组件配置与中文语义增强,教程涵盖全流程操作指南,帮助用户快速掌握AI文生图模型的本地部署技巧,提升创作效率。

weixin_30752699的博客 312

Unity 性能问题的优化

文章目录1. 优化Unity中的脚本简介用我们的代码诊断问题关于Unity如何构建和运行游戏的简要介绍建立过程我们编写的代码和已编译的代码之间的关系Unity Engine代码与脚本代码之间的运行时通信代码性能不佳的原因改善代码的性能编写高效的代码尽可能将代码移出循环考虑代码是否必须每帧运行仅在情况发生变化时运行代码每[x]帧运行一次代码使用缓存使用正确的数据结构尽量减少垃圾收集的影响使用对象池避...

Terie的博客 2749

PyTorch实战(2)——使用PyTorch构建神经网络

在本节中,我们使用 PyTorch 在简单数据集上构建了一个神经网络,训练神经网络来映射输入和输出,并通过执行反向传播来更新权重值以最小化损失值,并利用 Sequential 类简化网络构建过程;介绍了获取网络中间值的常用方法,以及如何使用 save、load 方法保存和加载模型,以避免再次训练模型。

盼小辉丶的博客 1万+

JAVA垃圾回收器源码_浅谈关于Java的GC垃圾回收器的一些基本概念

一、基本回收算法1. 引用计数(Reference Counting)比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。2. 标记-清除(Mark-Sweep)此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应...

weixin_35087326的博客 313

【HomeAssistant接入的设备实现天猫精灵】

Home Assistant的HassLife组件: 此Home Assistant的组件可以让天猫精灵、小爱同学对接HomeAssistant平台上的设备,控制设备、查询上报设备状态。 注意:本插件只负责上报HomeAssistant的设备状态信息到服务器,控制功能需要在HassLife 平台上配置。.........

vor234的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

unity打包苹果ARF

Multithreaded Rendering 取消勾选 Use incremental GC 取消勾选 Active Input Handling. 选择为Both Allow ‘unsafe’ Code 打勾 ——重要的— R Render Over Native UI 取消勾选 XR Plug-in Management下ARKit 勾选; initialize XR on Startup勾选 ...

sunhao521111的博客 2338

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Unity 增量垃圾回收(Incremental GC)

Unity增量GC(Incremental Garbage Collection)通过将垃圾回收工作拆分为多帧执行,有效缓解传统Stop-the-World GC导致的突发性卡顿问题。默认启用的增量GC能分散负载,将单次长卡顿转化为多帧短耗时,显著提升帧率稳定性。文章详解了其工作原理、配置方法,并通过Profiler对比展示了性能差异。虽然增量GC是推荐方案,但在引用变更频繁或写屏障开销敏感的特殊场景下可能需要禁用。开发WebGL项目时需注意平台不支持增量GC。最佳实践建议结合VSync优化和对象池等技术,

分享知识,拥抱变化 1420

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Unity性能优化核心技巧】:如何利用生命周期函数减少Update的滥用?

掌握Unity性能优化关键,合理运用C# MonoBehaviour生命周期函数替代频繁Update调用。适用于游戏开发中对象更新、事件监听等场景,通过Start、FixedUpdate、OnDisable等方法降低开销,提升运行效率。减少CPU占用,优化项目性能,值得收藏。

FastSolve的博客 632

【Unity Optimize】Unity中的优化工具和优化方法介绍

当我们开发一个项目时,不要一开始就想去优化所有的东西,这会干扰我们建立一个具备所需功能且可测试的项目;不必要的优化会浪费时间,甚至会导致一些错误。相反,应该在开发的过程中从一开始就将优化技巧融入到工作流程中。当完成一个可运行的项目时,应该使用Profiler窗口监控性能 并在目标设备上进行测试,只在需要的时候才进行优化。换句话说,优化应该是一个持续的过程,应该在确保项目功能正常的基础上进行,而不是一次性完成。

Sig的博客 2992

unity导出面板详解(pc版)

unity导出面板详解(pc版) 目录 Resolution and Presentation(分辨率和显示) Fullscreen Mode(全屏模式) 全屏模式 参数 功能 Fullscreen Window 将应用程序窗口设置为显示器的全屏原始分辨率 。 Exclusive Fullscreen 设置应用程序以保持对显示器的单独全屏使用。 Maximized Window (Mac only)将应用程序窗口设置为操作系统的“最大化”定义。 Windowed 窗口模式

发布unity,三维模型的相关内容 7816

JVM垃圾回收机制总结(4) :新一代的垃圾回收算法

JVM垃圾回收机制总结(4) :新一代的垃圾回收算法 博客分类: J2SE - JVM与CLASS 算法JVM多线程UP设计模式 全文转载: http://pengjiaheng.iteye.com/blog/548472 作者: 和你在一起 (

mengw的专栏 487
上一篇: Unity标准化的场景渲染流程
BUG豆荚
博客等级 码龄8年 1461粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值