使用错误的 gralloc usage flag甚至会掉帧

部署运行你感兴趣的模型镜像

这是一个非常经典的问题,使用错误的 gralloc usage flag 会直接影响 buffer 的分配方式和内存访问路径,从而造成严重的性能问题,甚至掉帧

我们来一步步解释这个问题:


1. 什么是 gralloc usage flag?

Gralloc(Graphics Allocation)是 Android HAL 中用于 GPU/Camera/Display/Codec 等模块分配图形 buffer 的服务。
这些 buffer 的用途千差万别,所以需要使用一组标志(usage flags)告诉 gralloc:

  • 谁会访问这个 buffer(CPU 还是 GPU 还是硬件 codec)?

  • 怎么访问(读?写?频繁?偶尔?)?

  • 是否需要物理连续内存?是否用于 DMA?


2. 如果使用了错误的 flag 会发生什么?

情况一:flag 表示“CPU 只读”,但其实你还要写
  • gralloc 可能分配一个只读映射的内存(mmap 只映射成读)

  • 当你尝试写入,就可能出错或性能极差(页保护、异常、TLB flush)

情况二:你没有加 SW_*,但你用 CPU 访问
  • gralloc 会以为你不需要 CPU 访问,可能根本不会分配可映射的 buffer

  • 所以你访问 buffer 时要么失败,要么触发昂贵的 cache flush / sync

情况三:你没有加 HW_VIDEO_ENCODER,但其实是送给 codec 的
  • gralloc 不知道这是 encoder 用途,可能没走 IOMMU、没走连续内存

  • 导致 encoder 无法直接 DMA,增加 memcpy 或 map copy 的开销

  • 高并发时很容易掉帧,尤其是视频录制(要求 steady 30fps 或 60fps)


3. 问题总结(掉帧原因)

缺少正确的 usage flags → gralloc 分配不合适的 buffer → 导致访问失败或访问慢 → 导致某些阶段等待过久 → pipeline 堵塞 → 帧被 drop


4. 正确做法

根据你的 buffer 用途添加合适的 flag,比如:

  • CPU 要频繁读写 → GRALLOC1_PRODUCER_USAGE_CPU_READ_OFTEN + GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN

  • encoder 读 buffer → GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER

  • GPU 用 → GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE(GL)或 HWCOMPOSER

  • camera output → GRALLOC1_CONSUMER_USAGE_CAMERA


5. 为什么用了正确 flag 就不卡了?

因为 gralloc 会根据 flag 做:

  • 更合适的 buffer 类型选择(ION heap 类型、contiguous or not)

  • 合适的 cache 策略(cached or uncached)

  • 更优的 DMA 或物理地址映射

  • 避免多余的 memcpy / sync,减少延迟,确保 pipeline 平稳运行

您可能感兴趣的与本文相关的镜像

Wan2.2-I2V-A14B

Wan2.2-I2V-A14B

图生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值