UPL10-2——视频资源优化

前置知识:U4S3——视频播放

视频优化的核心理念

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

视频优化决策流程:

  1. 根据视频用途选择加载方式

    小文件预加载,大文件流式加载

  2. 根据目标平台选择编码格式

    移动端:H.264,Web平台:WebM

  3. 根据设备性能调整画质参数

    分辨率、码率、帧率

  4. 严格管理生命周期

    及时释放资源,监控内存使用

视频转码相关

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

视频加载方式优化

Unity 中视频主要通过 VideoPlayer 组件处理,关键设置参数:

  1. Source(视频源)

    image

    • URL:外部视频文件, streaming 方式加载
    • VideoClip:内部视频资源,可预加载
  2. Render Mode(渲染模式)

    image

    • Camera Far / Near Plane:渲染到摄像机,消耗 GPU
    • Render Texture:渲染到纹理,可复用
    • Material Override:替换材质纹理
    • API Only:仅数据,不渲染(只能通过脚本 API 来访问数据)

    通过为 VideoPlayer 的 frameReady​ 事件添加回调函数
    在回调中使用 VideoPlayer.texture​ 属性来获取当前帧的 Texture2D

  3. Audio Output Mode(音频输出模式)

    image

    • 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 模式(最低开销)

视频格式与编码优化

推荐视频格式:

  1. MP4(H.264 编码)

    兼容性最好,硬件解码支持广泛
    压缩率高,文件体积小
    推荐用于大多数场景

  2. WebM(VP8 / VP9 编码)

    开源格式,免版权,在 Web 平台有优势,移动端硬件解码支持有限

  3. MOV(ProRes 编码)

    高质量,编辑友好,文件体积大,不推荐运行时使用

视频编码参数优化:

  1. 分辨率适配

    根据目标设备选择合适分辨率

    1. 1080p → 高端设备
    2. 720p → 中端设备
    3. 480p → 低端设备
  2. 码率控制

    码率,也叫比特率,指的是视频文件每秒钟包含的数据量
    通常用 Mbps(兆比特/秒) 或 Kbps(千比特/秒) 表示:1 Mbps = 1000 Kbps
    把视频想象成一条水管里流出的水,码率就是水管的粗细
    水管越粗(码率越高),单位时间内流出的水越多(数据量越大),视频就越清晰

    • 高质量:5-8 Mbps(过场动画)
    • 中等质量:2-4 Mbps(游戏内视频)
    • 低质量:0.5-1.5 Mbps(背景循环视频)
  3. 帧率设置

    • 30 fps:大多数视频内容
    • 24 fps:电影感内容
    • 60 fps:高速运动内容
  4. 关键帧间隔

    推荐:2-4 秒一个关键帧

    • 过短:文件体积增大
    • 过长:跳转 (seek) 操作延迟

内存与性能优化

  1. 显存管理

    RenderTexture 尺寸匹配视频分辨率,及时释放不用的 RenderTexture
    使用 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 设置

生命周期管理

  1. 资源管理

    使用 Addressables​ 管理 VideoClip​ 资源
    及时调用 VideoPlayer.Stop()​ 和 Resources.UnloadUnusedAssets()
    监控 Profiler 中 Video 内存占用

  2. 播放控制

    使用 Prepare() 预加载减少播放延迟
    实现视频播放队列避免冲突,添加超时和错误处理机制

  3. 对象池

    对频繁使用的 VideoPlayer 组件使用对象池,复用 RenderTexture 减少创建开销

  4. 内存监控

    定期检查 Video 内存使用情况,设置视频内存预算(建议不超过总内存的 15%)
    低内存时自动释放非活跃视频资源

  5. 场景管理

    场景切换时确保停止所有视频播放
    使用异步加载避免视频播放卡顿

实用技巧与最佳实践

  1. 降级策略

    检测设备性能,调整视频质量,低端设备使用低分辨率版本,内存不足时跳过非必要视频

  2. 预加载策略

    • 重要视频:场景加载时预加载
    • 可选视频:触发时加载
    • 大视频:显示加载进度条
  3. 错误处理

    处理解码失败情况,提供备选方案(静态图片+音频),实现重试机制

  4. 测试要点

    在不同设备测试解码性能,验证内存泄漏,测试网络流媒体稳定性