Unity 性能优化三:动画模块、物理模块
目录
动画模块
Mecanim 模块
1.1 Animator active的数量
1.1.1 Culling Mode
1.1.2 Optimize Gameobject
1.1.3 Apply Root Motion
1.1.4 Compute Skinning
1.1.5 Animator Initialize
1.2 Legacy动画
物理模块
2.1 物理更新次数
2.1 减少不必要的Collision
2.5 Auto Simulation
2.6 RaycastCommand
2.7 碰撞产生GC
2.8 Raycast、BoxCast、OverlapBox等函数产生的GC
动画模块
Mecanim 模块
1.1 Animator active的数量
1.1.1 Culling Mode
1. 设置animator的culling model,主要是针对视野中看不到的动画体,animator 更新的内容主要有:Retarget、IK、回传的transform信息
Always animate: 看不见也都更新,UI要使用
Culling Update Transform:不更新上面的部分,但逻辑,根节点还是更新的,依然可以收到 OnAnimatorMove 回调,即位置保持更新,动画不再,其他动画将被跳过,比如骨骼动画,IK,OnAnimatorIK,一般推荐使用这个,但是有的复杂动画,在进入视野时会有问题,如果有问题,更改为Always animate
Culling Completely:看不见完全不更新,比如静态的花草动画,不更新也没关系
它主要影响playerloop里面的 Animator.Update()方法的耗时
1.1.2 Optimize Gameobject
在模型导入的RIG 栏中,勾选该选项,native层的骨骼数据,将不会回传到c#层,默认开启
它主要影响playerloop里面的 MeshSkinning.Update(),勾选后,将在主线程计算Animator.WriteJob
1.1.3 Apply Root Motion
对不需要使用根节点的动画,不勾选这个,它的耗时主要体现在Animator.ApplyBuiltinRootMotion函数,当该函数的耗时占比较高时,需要确认场景中Animator对象是否都需要产生位移。
1.1.4 Compute Skinning
在projectsetting 里面,可以勾选这个,表示是否是有GPU加速计算骨骼动画
经uwa测试,开启之后耗时比不开始还大,主要是主线程在等待GPU计算
1.1.5 Animator Initialize
每次setactive或Instantiate激活一个带有animator的组件,会调用这个方法,可以把该物体的animator组件关闭,然后把物体移出屏幕外
1.2 Legacy动画
Animation.Sample的调用次数显示了场景中实际在更新的Animation对象的数量,而它的父节点Animation.Update的调用次数则是显示了场景中存在的Animation对象的数量。因此,优化Legacy Animation动画耗时则是要减少Animation.Sample的调用次数。
物理模块
2.1 物理更新次数
1. Unity物理系统的性能瓶颈主要体现在CPU端的耗时,它的主要耗时函数为FixedUpdate.PhysicsFixedUpdate。在开启Physics设置时,它的主要耗时堆栈是Physics.Processing和Physics.Simulate,需要针对这两个函数进行优化。
影响原因:
调用次数越多则耗时也就越高,调用次数受到Projectsetting->Time->Maximum Allowed Timestep和Fixed TimeStep的影响
Maximum Allowed TimeStep决定fxf了单帧物理最大调用次数,该值越小,单帧物理最大调用次数越少,一般为8~10FPS;Fixed TimeStep决定了FixedUpdate的更新间隔,该值越大,每帧物理更新调用次数越少。
当游戏卡顿时,单帧耗时比较长,则在下一帧会调用多次物理模拟,去跟上当前的时间进度
2.1 减少不必要的Collision
1. Physics Layer中取消不必要的层之间的碰撞检测,避免多余的Contacts的产生。
2. 尽量不要使用MeshCollider,如果非要用,可以勾选在Projectsetting->Prebake Collision Meshes
3. collider 只控制碰撞结果,不进行物理模拟
4. 如果不使用碰撞模拟,只想要触发结果,可以用trigger替代,也可以使用Collider.Bounds实现替代Trigger,避免使用Unity的物理模块。Trigger触发是比较方便的能够使用非物理模拟的方式来进行替换的一种Collision,使用C#逻辑来替代掉Trigger可以降低部分物理模块的耗时。
6. 如果使用了rigidbody,尽量不要直接修改transform改变物体位置,这样会在物理系统里面重新计算其位置,使用add force、move position
2.5 Auto Simulation
2. 如果项目不使用物理模拟,则在Edit>Project Settings>Physics关闭Auto Simulation选项,也可以通过脚本设置
3. Auto Sync Transforms,在Edit>Project Settings>Physics中开启或关闭,默认关闭,它表示是否在transform 发生改变时,同步到物理系统,关闭时,会把transform的变化缓存到数组里面,在fixedupdate的时候更新,也可以通过脚本设置
需要注意的是,关闭Auto Simulation的情况下,如果需要使用射线检测,则需要开AutoSyncTransform选项
2.6 RaycastCommand
如果射线比较多,可以使用RaycastCommand代替Raycas,在子线程中执行射线检测
2.7 碰撞产生GC
OnCollisionEnter/Stay/Exit 会将返回的的结果,生成新的实例,分配到内存中,所以会造成GC,可以在projectsetting->physics->勾选Reuse Collision Callbacks,默认开启,这样就不会生成新的实例,而是重复使用一个
2.8 Raycast、BoxCast、OverlapBox等函数产生的GC
这些函数,返回的结果都是一个单独的实例,分配到内存中,造成GC开销,使用其对应的NonAlloc版函数
相关文章:
Unity 性能优化三:动画模块、物理模块
目录 动画模块 Mecanim 模块 1.1 Animator active的数量 1.1.1 Culling Mode 1.1.2 Optimize Gameobject 1.1.3 Apply Root Motion 1.1.4 Compute Skinning 1.1.5 Animator Initialize 1.2 Legacy动画 物理模块 2.1 物理更新次数 2.1 减少不必要的Collision 2.5 A…...
延迟函数
Destory函数: public static void Destroy(Object obj, [DefaultValue("0.0F")] float t); Invoke函数: public void Invoke(string methodName, float time); 挂个空物体测试一下: public class DelayTest : MonoBehaviour {…...
IBM报告:2023数据泄露平均成本将达到445万美元
7月24日,IBM发布年度《数据泄露成本报告》显示,2023年全球数据泄露的平均成本达到445万美元,创该报告有史以来最高纪录,较过去3年均值增长了15%。同一时期,检测安全漏洞和漏洞恶化带来的安全成本上升了42&a…...
20.3 HTML 表格
1. table表格 table标签是HTML中用来创建表格的元素. table标签通常包含以下子标签: - th标签: 表示表格的表头单元格(table header), 用于描述列的标题. - tr标签: 表示表格的行(table row). - td标签: 表示表格的单元格(table data), 通常位于tr标签内, 用于放置单元格中的…...
flutter项目运行时一直卡在Running Gradle task ‘assembleDebug‘解决办法
1.修改项目中的android/build.gradle,将google(),mavenCentral()替换为下面的代码 maven { url https://maven.aliyun.com/repository/central/ }maven { url https://maven.aliyun.com/repository/public/ }maven { url https://maven.aliyun.com/repos…...
“深入理解Spring Boot:从入门到精通“
标题:深入理解Spring Boot:从入门到精通 摘要: Spring Boot是一款用于简化Spring应用开发的框架,它提供了一系列的开箱即用的功能和自动化配置,使得开发者能够快速构建、部署和运行Spring应用。本文将从入门到精通&am…...
IP 工具
什么是IP 工具 IP 工具是用于轻松扫描和排除网络 IP 地址空间故障的网络工程工具。IP 工具使网络管理员能够审核、跟踪和监视 IP 地址、子网以及使用 IP 的设备和主机的性能。这个全面的网络工程工具集包括高级 IP 工具,如 Ping、系统资源管理器、MAC 地址解析器和…...
Linux - 进程概念(进程状态、优先级)
1.进程状态 操作系统中进程有多种状态模型 三态模型 进程状态分为 就绪态,执行态,阻塞态。 就绪(Ready)状态:指进程已处于准备好运行的状态,即进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立…...
k8s概念-deployment
deployment用于部署无状态应用 Deployment集成了上线部署、滚动升级、创建副本、回滚等功能 Deployment里包含并使用了ReplicaSet Replicaset 通过改变Pod副本数量实现Pod的扩容和缩容 参考文档 https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/ …...
Flutter 调试工具篇 | 壹 - 使用 Flutter Inspector 分析界面
theme: cyanosis 1. 前言 很多朋友可能在布局过程中、或者组件使用过程中,会遇到诸如颜色、尺寸、约束、定位等问题,可能会让你抓耳挠腮。俗话说,磨刀不误砍柴工,会使用工具是非常重要的,其实 Flutter 提供了强大的调试…...
什么是云原生和 CNCF?
一、CNCF简介 CNCF:全称Cloud Native Computing Foundation(云原生计算基金会),成立于 2015 年 12 月 11 日,是一个开源软件基金会,它致力于云原生(Cloud Native)技术的普及和可持续…...
数据结构——单链表
无头单向非循环链表的建立 前言——什么链表链表形象图链表分类 一、Single_linked_list.h头文件的建立二、Single_linked_list.c功能函数的定义Single_linked_list_test.c主函数的定义四、代码运行测试五、Single_linked_list完整代码演示:总结 前言——什么链表 链…...
微信小程序手写签字版
在这里插入图片描述 wxml 请在下面的白框中签名 重置 提交 # js Page({ data: { signPath: [], cardNo: , preX: , preY: , }, onLoad(options) { this.setData({ cardNo: options.cardNo }) wx.createSelectorQuery().select(#myCanvas).fields({ node: true, size: true }).…...
机器学习十大经典算法
机器学习算法是计算机科学和人工智能领域的关键组成部分,它们用于从数据中学习模式并作出预测或做出决策。本文将为大家介绍十大经典机器学习算法,其中包括了线性回归、逻辑回归、支持向量机、朴素贝叶斯、决策树等算法,每种算法都在特定的领…...
HCIP-datacom-821题库真题和机构资料
HCIP-Datacom-Core Technology考试内容 HCIP-Datacom-Core Technology V1.0考试覆盖数据通信领域各场景通用核心知识,包括路由基础、OSPF、IS-IS、BGP、路由和流量控制、以太网交换技术、组播、IPv6、网络安全、网络可靠性、网络服务与管理、WLAN、网络解决方案。 机…...
javaSE,javaEE,javaME的区别
1. JavaSE(Java Platform,Standard Edition,又称J2SE),可以理解为Java标准版本 这个版本的jdk通常包含了Java日常开发使用的基本类,允许开发和部署在桌面、服务器、嵌入式环境和实时环境中中使用࿰…...
mysql innodb一些知识点
1、事务和锁的关系; 在MySQL事务中,只要开始了一次事务,就会自动加上一个共享锁(Shared Lock)。这个锁会在事务结束时自动释放。如果在事务中需要更新某个数据对象,那么MySQL会将该数据对象的共享锁升级为…...
Android 面试题 应用对内存是如何限制 八
🔥 OutOfMemeryError的原因 🔥 Android 针对每个应用有内存限制 , 当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error(注:非exception,因为这个问题已经严…...
赛车游戏——【极品飞车】(内含源码inscode在线运行)
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…...
无人机调试笔记——常见参数
无人机的PID调试以及速度相关参数 1、Multicopter Position Control主要是用来设置无人机的各种速度和位置参数。调试顺序是先调试内环PID,也就是无人机的速度闭环控制,确认没有问题后再进行外环位置控制,也就是定点模式控制。 2、调试的时…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
