107.视频资源优化

107.内存优化-资源优化-视频


107.1 知识点

视频优化的核心理念

分层加载,按需解码。 视频资源同时涉及内存、显存、CPU、GPU 和磁盘 I/O,优化目标是平衡画质与性能,避免播放卡顿和内存溢出。

视频转码相关

在 Unity 中导入视频后,可以利用内部的转码设置将视频转码为目标平台最优化的格式。建议开启转码,并且针对目标平台进行设置,它可以帮助获得更好的平台兼容性,达到性能优化的目的。如果关闭,Unity 会直接使用原始视频文件,可能由于该文件的编码格式在某些平台上不支持或者解码效率低,导致视频播放异常。

视频加载方式优化

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:仅数据

视频加载策略

策略 条件 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 设置

生命周期管理

  1. 资源管理 — 使用 Addressables 管理 VideoClip 资源;及时调用 VideoPlayer.Stop()Resources.UnloadUnusedAssets();监控 Profiler 中 Video 内存占用
  2. 播放控制 — 使用 Prepare() 预加载减少播放延迟;实现视频播放队列避免冲突;添加超时和错误处理机制
  3. 对象池 — 对频繁使用的 VideoPlayer 组件使用对象池;复用 Render Texture 减少创建开销
  4. 内存监控 — 定期检查 Video 内存使用情况;设置视频内存预算(建议不超过总内存的 15%);低内存时自动释放非活跃视频资源
  5. 场景管理 — 场景切换时确保停止所有视频播放;使用异步加载避免视频播放卡顿

实用技巧与最佳实践

  1. 降级策略 — 检测设备性能调整视频质量;低端设备使用低分辨率版本;内存不足时跳过非必要视频
  2. 预加载策略 — 重要视频在场景加载时预加载;可选视频在触发时加载;大视频显示加载进度条
  3. 错误处理 — 处理解码失败情况;提供备选方案(静态图片 + 音频);实现重试机制
  4. 测试要点 — 在不同设备测试解码性能;验证内存泄漏;测试网络流媒体稳定性

总结

视频优化决策流程:

  1. 根据视频用途选择加载方式 — 小文件预加载,大文件流式加载
  2. 根据目标平台选择编码格式 — 移动端 H.264,Web 平台 WebM
  3. 根据设备性能调整画质参数 — 分辨率、码率、帧率
  4. 严格管理生命周期 — 及时释放资源,监控内存使用

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

×

喜欢就点赞,疼爱就打赏