UPL4-2——生命周期函数的问题
UPL4-2——生命周期函数的问题 生命周期函数的调用顺序 我们在进行性能调试和问题定位时,如果不了解或忽略生命周期函数的执行顺序,可能会导致调试误判或遗漏真实性能问题 比如: 错误归因性能开销的位置 在 Profiler 中看到帧开头有较大开销 误以为是某个 Update() 耗时过长,但实际是前面的 Start() 或 OnEnable() 初始化造成的 我们不能只是关注 Update 部分,也要关注在 Awake、OnEnable、Start 中的逻辑 因为也可能是因为某些逻辑初始化造成的卡顿 逻辑初始化顺序错乱导致异常 场景中不同脚本中的相同生命周期函数的执行时机是不确定的 当两个脚本相互依赖时,比如 A 依赖 B 中的初始化数据 那么我们一定要保证 A 在使用 B 数据时,B 已经被初始化了 如果要指定某些脚本生命周期函数执行的优先级,可以在 Project Setting 内的 Script Execution Order 内进行配置 详见:U1L2——生命周期函数 的 不同脚本间生命周期函数的执行顺序...
UPL4-1——脚本挂载问题
UPL4-1——脚本挂载问题 检测脚本是否挂载的重要性 由于 Unity 的工作机制,继承 MonoBehaviour 的脚本必须挂载到对象上才有意义 我们在排查性能问题时,一定要确定相关脚本已经挂载 最简单有效的方式就是在 Hierarchy 窗口中输入:t:脚本名 这样 Hierarchy 窗口中就会显示挂载了该脚本的对象 检测脚本的执行次数 如果我们在使用 Profiler 进行问题排查时 发现某个 MonoBehaviour 方法执行的次数比预期的多或者执行的时间比预期的长 这时我们就应该排查该脚本在场景上出现的次数是否和预期的一样 避免由于挂载失误导致性能问题
UPL4——Unity 机制可能带来的问题
UPL4——Unity 机制可能带来的问题 Unity 机制可能带来的问题 Unity 引擎本身的设计机制或默认行为在某些情况下会导致性能、可维护性或功能性问题。 这些问题往往是非业务逻辑造成的隐患或小坑, 我们需要了解这些注意事项,从而避免对我们的性能分析带来干扰 脚本挂载问题 生命周期函数的问题 Debug 的性能消耗 垂直同步带来的等待问题 排除其他应用程序带来的问题
UPL3——Unity Profiler 脚本控制
UPL3——Unity Profiler 脚本控制 本章代码关键字 1234567891011Profiler.GetMonoUsedSizeLong() // 获取当前使用的Mono堆内存(单位:字节)Profiler.GetMonoHeapSizeLong() // 获取Mono堆的总大小,用来判断Mono内存是否接近上限Profiler.usedHeapSizeLong // 当前堆中使用的内存总量,包括所有托管内存Profiler.GetTotalAllocatedMemoryLong() // 获取所有Unity正在使用的内存总量(包括 Mono、Native、图形资源等)Profiler.GetTotalReservedMemoryLong() // 返回Unity从操作系统申请的内存总量,不管是否已经用上Profiler.GetTotalUnusedReservedMemoryLong() ...
UPL2-15——Asset Loading 模块
UPL2-15——Asset Loading 模块 Asset Loading 模块 Asset Loading(资源加载)模块是用来监视和分析 游戏运行时资源加载行为 的,它对性能调优、资源管理和加载策略优化具有重要意义 它主要是用于统计游戏在运行时加载资源所消耗的时间和调用信息 可以配合我们上节课学习的 File Access(资源访问)模块一起使用 Asset Loading 中各参数功能的含义和作用 资源加载(Asset Loading)监视视图 Other Reads(其他读取): 其他类型资源的读取操作,无法归类到下列类别时归入此项。例如某些 ScriptableObject、AssetBundle 元数据等。 Texture Reads(纹理读取): 加载贴图(Textures)时的读取次数和数据量,比如 .png、.jpg、.dds 等纹理资源。 Virtual Texture Reads(虚拟纹理读取): 虚拟纹理系统加载纹理数据时的读取量(Unity 的 Virtual Texturing...
UPL2-14——File Access 模块
UPL2-14——File Access 模块 关于文件读写相关,可见: U2L10——Resources资源动态加载 UH1——AssetBundle U4S4——可寻址资源管理系统 Addressables UN4L6——WWW类 和 UN4L8——UnityWebRequest类 UD4L2——文件相关、UD4L3——文件流相关、UD4L4——文件夹相关 File Access 模块 File Access(文件访问)模块,主要用于监控 游戏运行过程中 对文件系统的访问情况的,显示 游戏在运行时 读取或写入文件的行为 主要包括 读取资源(如 Textures、音频、文本)的行为 写入日志、存档文件 的行为 加载 Addressables 或 AssetBundle 的行为 使用 File.ReadAllText、WWW、UnityWebRequest 等 API 的行为 与 StreamingAssets、PersistentDataPath、Resources 等目录交互...
UPL2-13——Virtual Texturing 模块
UPL2-13——Virtual Texturing 模块 Virtual Texturing Virtual Texturing(虚拟纹理)它是一种按需加载纹理数据到 GPU 的技术, 它会把大纹理(比如 4K、8K)切成 小块 切片(tile),只加载相机可见部分,大幅减少显存占用,提高性能和纹理细节表现 它是为了解决 高分辨率纹理带来的性能和内存瓶颈问题 而设计的 它允许你只加载和渲染屏幕上可见的纹理切片(tile),从而显著节省内存并提升加载效率 使用场景: 超大贴图资源的场景,使用了非常大的纹理(如 4K、8K、16K 甚至更大) 比如:地形贴图,世界地图或大场景地表材质,巨型角色或建筑贴图 VT 只会加载屏幕上当前可见的部分纹理 tile,大大降低内存占用 开放世界类或需要流式加载的游戏 地图分区或区域化渲染需要按需加载纹理,使用 VT 可以只加载当前区域的纹理数据,减少载入延迟 希望减少 GPU 显存压力 普通纹理会完整上传到 GPU,VT 可以只上传可见 mip 和 tile,降低显存压力,避免卡顿 次世代 /...
UPL2-12——Realtime GI 模块
UPL2-12——Realtime GI 模块 Realtime GI 模块 Realtime GI(实时全局光照)模块,用于排查项目中 实时全局光照系统 的运行时性能开销 展示 CPU 侧用于 Realtime GI 的探针更新、任务调度、环境光照解算 等子系统的耗时情况 注意:不同 Unity 版本底层使用的光照系统可能不同,并且想要该模块记录数据,我们需要在 Unity 中开启实时全局光照功能 Window ——> Rendering ——> Lighting 中开启 Realtime GI 中各参数功能的含义和作用 实时全局光照 (Realtime GI) 性能分析视图 Light Probe(光照探针): 光照探针相关计算总耗时 如果你使用了大量动态物体与光照探针混合,耗时可能升高 Setup(设置): 光照系统每帧的设置初始化阶段 包括检测哪些网格、材质或光照发生了变化 Environment(环境光照): 对全局环境数据的处理,比如环境光、间接光设置的变化 大场景或频繁变更环境参数时可能消耗大 Input...
UPL2-11——UI 和 UI Details 模块
UPL2-11——UI 和 UI Details 模块 关于 UGUI 相关,详见:UG3——UGUI系列 UI 和 UI Details 模块 UI(用户交互界面)、UI Details(用户交互界面详细信息)两个模块,都是用于分析和优化 Unity 中 UI 系统性能 的工具,尤其是基于 UGUI 的项目 它们分别从整体统计和细节绘制层面来帮助我们排查性能问题 一般出现以下问题时,可以着重排查此处: UI 卡顿、掉帧 UI 绘制性能差 GPU 顶点绘制负担重 UI 材质、遮罩、裁剪过多 UI 刷新过于频繁 UI 批处理问题 等等 总之,所有和 UGUI 相关的问题都可以通过他们来进行排查 UI 和 UI Details 中各参数功能的含义和作用 用户交互界面(UI)性能检测窗口 Layout(布局):表示 Unity 的 UI 布局系统(LayoutGroup、ContentSizeFitter 等)在这一帧的耗时 它包括但不限于以下操作: ContentSizeFitter 的尺寸计算 Horizontal /...
UPL2-10——Physics (2D) 模块
UPL2-10——Physics (2D) 模块 2D 物理相关,详见:U3L9——2D物理系统 Physics (2D) 模块 Physics (2D)(2D物理学)模块是专门用于分析和排查 2D 物理系统(基于 Box2D 引擎) 的性能与行为的工具 主要帮助我们排查 2D 物理相关问题,使用 2D 物理系统制作的各类型游戏都可以使用该模块来分析排查问题 Physics(2D)中各参数功能的含义和作用 2D 物理学(Physics 2D)性能检测窗口 Total Contacts:总接触点数 当前帧中发生接触的 2D 碰撞点数量(如 OnCollisionEnter2D 所对应的接触点) 值高说明有很多碰撞交互,可能带来性能开销。 Total Shapes:总碰撞形状数 场景中所有的 Collider2D 组件数(如 BoxCollider2D、CircleCollider2D 等) 用于评估物理形状规模 Total Queries:总查询次数 这一帧中所有 2D 物理查询次数(如 Physics2D.Raycast,...
