UPL11——内存管理
UPL11——内存管理 垃圾回收时机 首先,我们应该尽量避免垃圾回收,因为垃圾回收将带来极大的 CPU 开销 但是如果我们不得不进行垃圾回收时,都建议在合适的时机手动进行,降低玩家的感知度 比如: 游戏暂停时 游戏过场景时 游戏显示读条界面时 等等 总之,需要在玩家察觉不到或不关心突然的性能下降而打断游戏行为时手动调用垃圾回收 结构体参数传递时的考虑 由于值传递和引用传递的区别,导致如果大结构体在函数之间传递时比起引用传递是更耗性能的 因此在进行大型结构体数据传递时,我们可以权衡是否使用 ref 传递 注意,如果希望函数内部对结构体对象的修改不影响外部,则不能使用 ref 传递 用 StringBuilder 替代 String 只要你要对字符串做大量修改,比如追加、拼接、替换等等 并且循环次数不确定或较大,就必须用 StringBuilder 举例: 12345string s = "";for (int i = 0; i < 10000; i++){ s += i; // 糟糕} 如果一个字符串频繁变化,使用...
UPL10-6——AB包和Resources资源优化
UPL10-6——AB包和Resources资源优化 前置知识:U2L10——Resources资源动态加载,UH1——AssetBundle,U4S4——可寻址资源管理系统 Addressables AssetBundle包与Resources资源管理的核心理念 AssetBundle 包(或 Addressables)的使用:实现资源热更新、减少包体大小、按需加载 Resources 的使用:谨慎使用、避免滥用、了解局限性 核心点:项目中尽量使用 AB 包或者 Addressables 管理加载项目资源 Resources 使用准则: 了解其成本,避免滥用 建立严格的加载、卸载规范 监控 Resources 内存占用 制定向 AssetBundle 包或 Addressables 的迁移计划 AssetBundle 包构建流程: 合理规划 AssetBundle 包粒度和依赖关系 选择合适的压缩方式(LZ4)和构建选项 建立版本管理和热更机制 实现依赖分析和循环检测 AssetBundle...
UPL10-5——材质与Shader资源优化
UPL10-5——材质与Shader资源优化 前置知识:US2S2L1——材质与Shader 材质与 Shader 内存优化的核心理念 材质优化目标: 最小化 纹理内存占用 降低 材质实例数量 降低 Shader 的计算负荷 Shader 优化目标: 减少变体数量,简化计算逻辑 核心矛盾:视觉质量 与 内存占用 和 GPU 计算负荷 的平衡 主要优化原则:关键角色高质量,大量物体低成本 材质优化流程: 设置合适的纹理压缩格式和尺寸 合理配置 Mip Maps 和 Read/Write 使用通道合并和纹理图集 开启纹理流送管理内存 Shader 优化流程: 剥离不需要的 Shader 变体 建立 Shader LOD 分级系统 简化 Shader 代码和计算 适配目标渲染管线 材质管理流程: 使用材质共享而非复制 按需使用 MaterialPropertyBlock 实现材质资源生命周期管理 建立材质复杂度分级标准 监控维护流程: 定期使用 Profiler...
UPL10-4——网格与动画资源优化
UPL10-4——网格与动画资源优化 前置知识:U3L17——模型导入相关设置 网格与动画优化的核心理念 减负、精简、按需加载 网格优化目标:降低顶点处理负荷和 GPU 传输负担 动画优化目标:降低 CPU 蒙皮计算和内存占用 核心矛盾:视觉保真度 和 CPU / GPU 性能 和 内存占用 的平衡 网格优化流程: 设置合适的压缩级别 取消 Read/Write,除非需要修改网格 开启 Optimize Mesh(优化网格) 按需使用 LOD 精简顶点数据 动画优化流程: 选择合适的压缩格式(Optimal 推荐) 设置合理的压缩质量 配置 Animator Culling 模式 按需使用 GPU Skinning 实现动画 LOD 系统 网格资源导入优化 网格导入设置是优化的第一道关卡 Mesh...
UPL10-3——纹理资源优化
UPL10-3——纹理资源优化 前置知识:U3L2——图片导入概述 纹理优化的核心理念 纹理是运行时内存占用的大头,优化目标是平衡视觉质量与内存、显存占用 核心矛盾:视觉保真度 和 内存、显存、加载时间的平衡 纹理优化决策流程: 根据用途选择正确的 Texture Type 和设置 绝不使用超过需要的纹理尺寸 为不同平台选择最优压缩格式、 平台 首选 备选 HDR格式 法线 遮罩贴图 特殊用途 PC BC7 BC3 BC6H BC5 DXT1|BC1 BC1、BC4(单通道) Android ASTC 4x4 ETC2 4bit ASTC HDR 6x6 ASTC 5x5 ETC2 4bit ASTC 6x6(远景、小道具) IOS ASTC 4x4 ASTC 6x6 ASTC HDR 4x4 ASTC 5x5 ASTC 6x6|8x8 EAC R/RG WebGL ASTC 4x4 DXT1/DXT5,ETC2,PVRTC BC6H BC5 DXT1|BC1 ASTC 6x6 / DXT1 合理使用 Mipmap...
UPL10-2——视频资源优化
UPL10-2——视频资源优化 前置知识:U4S3——视频播放 视频优化的核心理念 分层加载,按需解码 视频资源同时涉及内存、显存、CPU、GPU 和磁盘 I/O 优化目标是平衡画质与性能,避免播放卡顿和内存溢出 视频优化决策流程: 根据视频用途选择加载方式 小文件预加载,大文件流式加载 根据目标平台选择编码格式 移动端:H.264,Web平台:WebM 根据设备性能调整画质参数 分辨率、码率、帧率 严格管理生命周期 及时释放资源,监控内存使用 视频转码相关 在 Unity 中导入视频后,我们可以利用内部的转码设置(Transcode),将视频转码为目标平台最优化的格式 建议开启转码,并且针对目标平台进行设置,它可以帮助我们获得更好的平台兼容性,达到性能优化的目的 如果关闭,Unity 会直接使用原始视频文件,可能由于该文件的编码格式在某些平台上不支持,或者解码效率低,导致视频播放异常 视频加载方式优化 Unity 中视频主要通过 VideoPlayer 组件处理,关键设置参数: Source(视频源) URL:外部视频文件, streaming...
UPL10-1——音频资源优化
UPL10-1——音频资源优化 前置知识:U1L14——音效系统相关 音频优化的核心理念 按需加载,及时卸载 我们要尽量减少不必要的 AudioClip 在内存中驻留的 时间 和 大小 要尽量最小化活动音频的数量 音频加载方式优化 音频文件导入后非常重要的两个设置参数就是 Load Type (加载类型) 和 Preload Audio Data (预加载音频数据) 音频文件设置参数可见:U1L14-1——音效文件导入 首先来看 Preload Audio Data (预加载音频数据) 勾选后,当 AudioClip 资源被加载时(场景加载、Resources.Load、AB包、Addressables 加载等),立即加载音频数据 取消勾选,音频数据延迟加载,直到第一次需要播放时才加载 再来看 Load Type (加载类型) 中的三种模式: Decompress On Load(加载时解压) 工作机制: 加载时:音频文件完全加载到内存,并立即解压成原始的 PCM 格式 播放时:直接从内存中读取已解压的 PCM 数据,无需任何额外处理 内存与...
UPL10——资源优化
UPL10——资源优化 音频 视频 纹理 网格与动画 材质与Shader AB包和Resources
UPL9-17-h——应用场景
UPL9-17-h——应用场景 实际开发中 Compute Shader 的应用 Compute Shader 的本质是一个通用 GPU 并行计算程序, 它不是专门画图的,而是让你在 GPU 上自己定义数据的输入、计算和输出 它能够处理任何可并行的问题 比如: 大量独立元素的计算(像素、粒子、顶点、节点等等) 各元素的处理计算逻辑相似的情况 不依赖严格计算顺序的逻辑(或可通过原子操作、同步与内存屏障函数 控制顺序) 等等 Compute Shader 在图形计算相关的应用 后处理效果 模糊、Bloom、锐化、边缘检测、景深、色调映射等等 光照计算 全局光照、预计算辐射,反射探针更新,环境光遮蔽等等 粒子系统 上万粒子的物理模拟与更新 GPU 剔除 大量模型实例在 GPU 上筛选可见与否,提高渲染性能 体积渲染 体积雾、云、烟、体积光等等 地形、水面模拟 GPU 波浪、流体高度场更新等等 程序纹理生成 在 GPU 上生成噪声纹理、发现图、流动贴图等等 GPU 蒙皮 在 GPU 侧计算骨骼动画等等 等等 Compute Shader...
