107.内存优化-资源优化-视频
107.1 知识点
视频优化的核心理念
分层加载,按需解码。 视频资源同时涉及内存、显存、CPU、GPU 和磁盘 I/O,优化目标是平衡画质与性能,避免播放卡顿和内存溢出。
视频转码相关
在 Unity 中导入视频后,可以利用内部的转码设置将视频转码为目标平台最优化的格式。建议开启转码,并且针对目标平台进行设置,它可以帮助获得更好的平台兼容性,达到性能优化的目的。如果关闭,Unity 会直接使用原始视频文件,可能由于该文件的编码格式在某些平台上不支持或者解码效率低,导致视频播放异常。

视频加载方式优化
Unity 中视频主要通过 VideoPlayer 组件处理。

关键设置参数
1. Source(视频源)
URL:外部视频文件,streaming 方式加载VideoClip:内部视频资源,可预加载
2. Render Mode(渲染模式)
Camera Far/Near Plane:渲染到摄像机,消耗 GPURender Texture:渲染到纹理,可复用Material Override:替换材质纹理API Only:仅数据,不渲染(只能通过脚本 API 来访问数据),通过为 VideoPlayer 的frameReady事件添加回调函数,在回调中使用VideoPlayer.texture属性来获取当前帧的 Texture2D
3. Audio Output Mode(音频输出模式)
None:无音频输出Audio Source:输出到指定 AudioSourceDirect:直接输出,性能更好API Only:仅数据
视频加载策略
| 策略 | 条件 | Source | 管理方式 | 适用场景 |
|---|---|---|---|---|
| 小视频预加载 | < 10MB | VideoClip | AssetBundle 或 Addressables | UI 动画、过场动画 |
| 大视频流式加载 | > 10MB | URL(指向 StreamingAssets 或远程服务器) | 按需加载,节省内存 | 背景视频、过场电影 |
渲染模式选择:
- 需要后处理效果 → Camera Plane 模式
- 需要复用或 UI 显示 → Render Texture 模式
- 仅需要数据 → API Only 模式(最低开销)
视频格式与编码优化
推荐视频格式
| 格式 | 编码 | 优势 | 劣势 | 推荐场景 |
|---|---|---|---|---|
| MP4 | H.264 | 兼容性最好,硬件解码支持广泛,压缩率高,文件体积小 | — | 大多数场景(推荐) |
| WebM | VP8/VP9 | 开源格式,免版权,Web 平台有优势 | 移动端硬件解码支持有限 | Web 平台 |
| MOV | ProRes | 高质量,编辑友好 | 文件体积大 | 仅用于编辑,不推荐运行时使用 |
视频编码参数优化
1. 分辨率适配
根据目标设备选择合适分辨率:
| 分辨率 | 目标设备 |
|---|---|
| 1080p | 高端设备 |
| 720p | 中端设备 |
| 480p | 低端设备 |
2. 码率控制
码率(也叫比特率)指的是视频文件每秒钟包含的数据量,通常用 Mbps(兆比特/秒) 或 Kbps(千比特/秒) 表示,1 Mbps = 1000 Kbps。把视频想象成一条水管里流出的水,码率就是水管的粗细——水管越粗(码率越高),单位时间内流出的水越多(数据量越大),视频就越清晰。
| 码率范围 | 适用场景 |
|---|---|
| 5 ~ 8 Mbps | 过场动画(高质量) |
| 2 ~ 4 Mbps | 游戏内视频(中等质量) |
| 0.5 ~ 1.5 Mbps | 背景循环视频(低质量) |
3. 帧率设置
| 帧率 | 适用场景 |
|---|---|
| 30fps | 大多数视频内容 |
| 24fps | 电影感内容 |
| 60fps | 高速运动内容 |
4. 关键帧间隔
推荐 2 ~ 4 秒一个关键帧。过短会导致文件体积增大,过长会导致 seek(跳转) 操作延迟。
内存与性能优化
显存管理
- Render Texture 尺寸匹配视频分辨率
- 及时释放不用的 Render Texture
- 使用 Mipmap 避免闪烁(静态背景视频)
CPU 优化
- 限制同时播放的视频数量(建议 1 ~ 2 个)
- 避免频繁的 VideoPlayer 启停
- 使用
Prepare()预加载视频数据
磁盘 I/O 优化
- StreamingAssets 中的视频文件保持连续存储
- 避免播放过程中读取其他大文件
- 使用缓存机制减少重复加载
音频分离
- 视频文件只包含画面,音频单独处理
- 减少视频文件体积
- 更灵活的音频控制
平台特定优化
| 平台 | 建议 |
|---|---|
| iOS | 使用 H.264 Baseline Profile;避免使用 Alpha 通道视频(内存翻倍) |
| Android | 使用 H.264 Main Profile;测试硬件解码兼容性 |
| WebGL | 使用 WebM 格式获得更好兼容性;注意同源策略和 CORS 设置 |
生命周期管理
- 资源管理 — 使用 Addressables 管理 VideoClip 资源;及时调用
VideoPlayer.Stop()和Resources.UnloadUnusedAssets();监控 Profiler 中 Video 内存占用 - 播放控制 — 使用
Prepare()预加载减少播放延迟;实现视频播放队列避免冲突;添加超时和错误处理机制 - 对象池 — 对频繁使用的 VideoPlayer 组件使用对象池;复用 Render Texture 减少创建开销
- 内存监控 — 定期检查 Video 内存使用情况;设置视频内存预算(建议不超过总内存的 15%);低内存时自动释放非活跃视频资源
- 场景管理 — 场景切换时确保停止所有视频播放;使用异步加载避免视频播放卡顿
实用技巧与最佳实践
- 降级策略 — 检测设备性能调整视频质量;低端设备使用低分辨率版本;内存不足时跳过非必要视频
- 预加载策略 — 重要视频在场景加载时预加载;可选视频在触发时加载;大视频显示加载进度条
- 错误处理 — 处理解码失败情况;提供备选方案(静态图片 + 音频);实现重试机制
- 测试要点 — 在不同设备测试解码性能;验证内存泄漏;测试网络流媒体稳定性
总结
视频优化决策流程:
- 根据视频用途选择加载方式 — 小文件预加载,大文件流式加载
- 根据目标平台选择编码格式 — 移动端 H.264,Web 平台 WebM
- 根据设备性能调整画质参数 — 分辨率、码率、帧率
- 严格管理生命周期 — 及时释放资源,监控内存使用
107.2 知识点代码
Lesson107_内存优化_资源优化_视频.cs
public class Lesson107_内存优化_资源优化_视频
{
#region 知识点一 视频优化的核心理念
// 分层加载,按需解码
// 视频资源同时涉及内存、显存、CPU、GPU 和磁盘 I/O
// 优化目标是平衡画质与性能,避免播放卡顿和内存溢出
#endregion
#region 知识点二 视频转码相关
// 在 Unity 中导入视频后,我们可以利用内部的转码设置
// 将视频转码为目标平台最优化的格式
// 建议开启转码,并且针对目标平台进行设置
// 它可以帮助我们获得更好的平台兼容性,达到性能优化的目的
// 如果关闭,Unity 会直接使用原始视频文件,可能由于该文件的编码格式在某些平台上不支持
// 或者解码效率低,导致视频播放异常
#endregion
#region 知识点三 视频加载方式优化
// Unity 中视频主要通过 VideoPlayer 组件处理
// 关键设置参数:
// 1. Source(视频源)
// URL:外部视频文件,streaming 方式加载
// VideoClip:内部视频资源,可预加载
// 2. Render Mode(渲染模式)
// Camera Far/Near Plane:渲染到摄像机,消耗 GPU
// Render Texture:渲染到纹理,可复用
// Material Override:替换材质纹理
// API Only:仅数据,不渲染(只能通过脚本 API 来访问数据)
// 通过为 VideoPlayer 的 frameReady 事件添加回调函数
// 在回调中使用 VideoPlayer.texture 属性来获取当前帧的 Texture2D
// 3. Audio Output Mode(音频输出模式)
// None:无音频输出
// Audio Source:输出到指定 AudioSource
// Direct:直接输出,性能更好
// API Only:仅数据
// 视频加载策略:
// 1. 小视频预加载(< 10MB)
// 使用 VideoClip 作为 Source
// 配合 AssetBundle 或 Addressables 管理
// 适用场景:UI 动画、过场动画
// 2. 大视频流式加载(> 10MB)
// 使用 URL 作为 Source,指向 StreamingAssets 或远程服务器
// 按需加载,节省内存
// 适用场景:背景视频、过场电影
// 3. 渲染模式选择
// 需要后处理效果:Camera Plane 模式
// 需要复用或 UI 显示:Render Texture 模式
// 仅需要数据:API Only 模式(最低开销)
#endregion
#region 知识点四 视频格式与编码优化
// 推荐视频格式:
// 1. MP4(H.264 编码)
// 兼容性最好,硬件解码支持广泛
// 压缩率高,文件体积小
// 推荐用于大多数场景
// 2. WebM(VP8/VP9 编码)
// 开源格式,免版权
// 在 Web 平台有优势
// 移动端硬件解码支持有限
// 3. MOV(ProRes 编码)
// 高质量,编辑友好
// 文件体积大,不推荐运行时使用
// 视频编码参数优化:
// 1. 分辨率适配
// 根据目标设备选择合适分辨率
// 1080p → 高端设备
// 720p → 中端设备
// 480p → 低端设备
// 2. 码率控制
// 码率,也叫比特率,指的是视频文件每秒钟包含的数据量
// 通常用 Mbps(兆比特/秒)或 Kbps(千比特/秒)表示
// 1 Mbps = 1000 Kbps
// 把视频想象成一条水管里流出的水,码率就是水管的粗细
// 水管越粗(码率越高),单位时间内流出的水越多(数据量越大),视频就越清晰
// 高质量:5-8 Mbps(过场动画)
// 中等质量:2-4 Mbps(游戏内视频)
// 低质量:0.5-1.5 Mbps(背景循环视频)
// 3. 帧率设置
// 30fps:大多数视频内容
// 24fps:电影感内容
// 60fps:高速运动内容
// 4. 关键帧间隔
// 推荐:2-4 秒一个关键帧
// 过短:文件体积增大
// 过长:seek(跳转)操作延迟
#endregion
#region 知识点五 内存与性能优化
// 1. 显存管理
// Render Texture 尺寸匹配视频分辨率
// 及时释放不用的 Render Texture
// 使用 Mipmap 避免闪烁(静态背景视频)
// 2. CPU 优化
// 限制同时播放的视频数量(建议 1-2 个)
// 避免频繁的 VideoPlayer 启停
// 使用 Prepare() 预加载视频数据
// 3. 磁盘 I/O 优化
// StreamingAssets 中的视频文件保持连续存储
// 避免播放过程中读取其他大文件
// 使用缓存机制减少重复加载
// 4. 音频分离
// 视频文件只包含画面,音频单独处理
// 减少视频文件体积
// 更灵活的音频控制
// 平台特定优化:
// iOS:
// 使用 H.264 Baseline Profile
// 避免使用 Alpha 通道视频(内存翻倍)
// Android:
// 使用 H.264 Main Profile
// 测试硬件解码兼容性
// WebGL:
// 使用 WebM 格式获得更好兼容性
// 注意同源策略和 CORS 设置
#endregion
#region 知识点六 生命周期管理
// 1. 资源管理
// 使用 Addressables 管理 VideoClip 资源
// 及时调用 VideoPlayer.Stop() 和 Resources.UnloadUnusedAssets()
// 监控 Profiler 中 Video 内存占用
// 2. 播放控制
// 使用 Prepare() 预加载减少播放延迟
// 实现视频播放队列避免冲突
// 添加超时和错误处理机制
// 3. 对象池
// 对频繁使用的 VideoPlayer 组件使用对象池
// 复用 Render Texture 减少创建开销
// 4. 内存监控
// 定期检查 Video 内存使用情况
// 设置视频内存预算(建议不超过总内存的 15%)
// 低内存时自动释放非活跃视频资源
// 5. 场景管理
// 场景切换时确保停止所有视频播放
// 使用异步加载避免视频播放卡顿
#endregion
#region 知识点七 实用技巧与最佳实践
// 1. 降级策略
// 检测设备性能,调整视频质量
// 低端设备使用低分辨率版本
// 内存不足时跳过非必要视频
// 2. 预加载策略
// 重要视频:场景加载时预加载
// 可选视频:触发时加载
// 大视频:显示加载进度条
// 3. 错误处理
// 处理解码失败情况
// 提供备选方案(静态图片 + 音频)
// 实现重试机制
// 4. 测试要点
// 在不同设备测试解码性能
// 验证内存泄漏
// 测试网络流媒体稳定性
#endregion
#region 总结
// 视频优化决策流程
// 1. 根据视频用途选择加载方式
// 小文件预加载,大文件流式加载
// 2. 根据目标平台选择编码格式
// 移动端:H.264,Web 平台:WebM
// 3. 根据设备性能调整画质参数
// 分辨率、码率、帧率
// 4. 严格管理生命周期
// 及时释放资源,监控内存使用
#endregion
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com