ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Android Camera性能优化实战:Buffer管理、帧率时延与功耗调优

Android Camera性能优化实战:Buffer管理、帧率时延与功耗调优 做Android开发这些年只要项目里带Camera模块性能优化就是绕不开的一关。不管是系统级Camera HAL/Tuning还是三方App调用相机预览掉帧、拍照卡顿、录像发热降帧、启动黑屏这些问题每个项目里基本都会见到一遍。这篇文章把我在Camera性能优化上踩过的坑和沉淀下来的方法整理一遍主要围绕Android Camera这条链路从Buffer管理、帧率时延、CPU/GPU负载到三方App兼容性来展开。内容会偏实战适合正在做Camera相关开发的工程师参考也适合想从App层切入做整体优化的朋友当作导航图。1. 先把优化目标拆清楚从帧率、时延、功耗、内存四条线说开Camera性能优化最容易犯的错就是一上来就盯FPS。帧率固然重要但它只是结果不是原因。真正要管理的是四条线帧率、时延、功耗和内存。这四条线互相牵扯比如降低分辨率能提帧率但牺牲画质增加Buffer数量能降时延但吃内存把编码码率调高画质好了但功耗上来了机器开始发热降频。所以做优化之前先得把目标量化不然就是在打地鼠。1.1 Camera性能四大核心指标别再只盯FPS先说说我看项目时最先确认的几个指标帧率FPS预览和录像的流畅度。稳定比数值高低更关键30FPS稳定比40FPS但忽高忽低更符合用户感知。启动时延从App发起Camera open到第一帧预览上屏的时间。这里又分冷启动和热启动冷启动要算CameraService进程拉起耗时热启动主要是HAL流重启和Buffer分配耗时。功耗与温度录像、视频通话这类长时间场景机器容易热降频一旦降频帧率就守不住。内存与Buffer分配频繁new大对象、GC抖动、ImageReader不断申请释放Buffer都是肉眼可见的掉帧根源。拿食堂流水线来类比可能更好理解Camera出图就像出餐厨师炒菜快ISP处理还不够备菜Buffer分配、传菜跨进程传递、收盘子Buffer释放任何一个环节拖后腿整体吞吐都上不去。而且高峰期高分辨率高帧率最先崩的往往不是厨师而是备菜和收盘子的环节。这就解释了为什么很多项目在720P预览时一切正常切到4K预览就开始掉帧甚至ANR——不是ISP能力不足是Buffer管理和内存分配先撑不住了。1.2 典型场景的差异化优化策略不同场景对性能的要求权重差别很大不要拿同一套参数跑天下。预览追求实时性画质可以适当让步拍照追求单帧画质和快门时延连拍则更看重吞吐录像追求长时间稳定编码码率和帧率必须可控三方App兼容则要把稳定性和兼容性放最前面。场景首要指标次要指标常见瓶颈预览帧率稳定、出帧时延低分辨率、视角Buffer分配、SurfaceFlinger合成拍照拍照时延、单帧画质连拍吞吐JPEG编码、ISP处理时延录像长时间帧率稳定、功耗码率、画质编码器负载、热降频三方App兼容性、崩溃率启动速度API差异、权限适配、机型覆盖特别要提到三方App这一栏。如果做的是系统级Camera HAL三方App的兼容性很容易被忽略。很多App直接调Camera2的API用YUV_420_888格式拿预览流如果你的HAL在某些尺寸下不支持这个格式或者Buffer Queue给不够App端就会出现黑屏、预览花屏、拍照崩溃。热搜里那些content://com.tencent.wework.fileprovider、content://com.baidu.searchbox.fileprovider之类的路径本质就是三方App在适配过程中出现的FileProvider配置和外部目录访问问题后面会专门讲。2. 预览链路优化多数卡顿的源头都在这预览是所有Camera功能的地基。拍照也好录像也好通常都会先起预览流。所以预览链路的流畅度直接决定了用户的第一印象而且这里也是问题最多的地方。我处理过的Camera性能问题里大概有七成出在预览链路。2.1 理解Camera HAL到SurfaceFlinger的整条链路先理一下数据流向。一个典型的预览请求从App层发出后大致经过这么几个节点App通过Camera2 API往CameraService提交Capture RequestCameraService把请求下发给HALHAL驱动Sensor曝光再加ISP处理输出图像Buffer到指定的SurfaceSurface再通过BufferQueue把数据交给SurfaceFlinger合成最后上屏。这条链路里每一步都有可能出现瓶颈HAL输出帧率不足Sensor或者ISP处理不过来。BufferQueue阻塞消费速度跟不上生产速度生产者被block住。格式转换开销YUV转RGB、旋转缩放这些操作如果不走GPU硬加速CPU负载一下就上去了。SurfaceFlinger合成瓶颈多窗口叠加、GPU负载过高时合成会掉帧。排查的时候我习惯先分两个方向是生产端不行还是消费端不行。生产端不行大多在HAL层消费端不行大多在App层的取帧和绘制逻辑。用工具定位的时候Perfetto里看BufferQueue的producer和consumer的状态FIFO有没有满哪个节点卡住了——这是最快定位瓶颈的方法。2.2 Buffer管理比想象中更影响帧率的关键点Buffer管理是最值得花精力打磨的地方。很多App调用ImageReader获取预览帧用来做人脸检测、美颜、滤镜结果帧率怎么都上不去代码逻辑也没问题就是卡。最后发现是Buffer数量设置太多而且每一帧都调image.close()调晚了。我自己试下来的几个经验Buffer数量不是越大越好。ImageReader如果设置了maxImages为N系统就固定分配N个Buffer。太少了容易丢帧太多了内存涨幅大、分配耗时也高。预览场景3~4个通常够用连拍可以考虑5~6个但不要盲目给到10。必须及时close。这是新手最容易踩的坑。拿到Image之后如果不调用image.close()Buffer就还回去了没释放时间一长队列塞满新的帧进不来帧率直接掉到个位数。我见过不止一个项目最后发现是这个原因。用acquireLatestImage还是acquireNextImage要想清楚。做预览显示的其实只关心最新一帧用acquireLatestImage会丢掉积压的旧帧时延更低但如果你要做慢动作或者逐帧分析就得用acquireNextImage一帧一帧拿。尽量复用对象。每帧都new一个大数组或者ByteBufferGC会频繁触发。比较好的做法是在回调里开一个对象池复用同一块内存只替换数据内容。还要提一个关键选择预览到底用SurfaceView、TextureView还是ImageReader。很多人为了拿帧做算法直接把Camera的预览输出配到ImageReader上然后用OpenGL或者Canvas把YUV画到TextureView上。这样链路就变成Camera → ImageReader → CPU取帧 → GPU绘制 → 上屏。多了一次拷贝CPU和GPU各折腾一遍功耗和帧率都会有影响。如果像素级算法不是必须的更推荐把Camera输出直接给SurfaceView显示走硬件合成帧率最高的同时功耗最低。只有必须要处理每一帧图像时才走ImageReader而且处理完之后也要尽量用GPU做绘制避免CPU参与最终的合成。2.3 预览尺寸与格式选型选不对硬件再强也白搭预览尺寸的选择直接影响带宽和内存占用。4K预览需要的像素量是1080P的四倍Buffer带宽、内存占用、ISP负载全部跟着翻倍。实际项目里很多场景1080P就够用了没必要硬上4K。选择预览尺寸时要结合屏幕分辨率和Camera传感器原生比例尽量选择Camera支持的、和屏幕比例一致的尺寸避免裁剪缩放。格式方面预览流最常见的两种格式是PRIVATE硬件直接处理的私有格式和YUV_420_888。SurfaceView和TextureView走的是PRIVATEImageReader可以配YUV_420_888。PRIVATE格式下从Sensor到屏幕全程基本不经过CPU带宽省、功耗低。YUV_420_888是给算法使用、分析和图像处理用的标准格式拿到手之后可以很方便地转换给OpenGL、NV21数组、Bitmap等使用但多了一次从HAL输出到CPU可见内存的拷贝如果整个链路上有CPU参与带宽开销就会上来。所以说白了格式的选择不只是一个格式问题它决定了你的数据通路走哪条线硬件直通还是CPU介入处理。部分机型还支持RAW输出这通常用于专业摄影类App要做大量的后处理性能开销极高一般不建议在实时预览场景里去碰RAW。3. 拍照与录像链路调优时延和稳定性的平衡预览只是地基拍照和录像才是真正要求性能上限的功能。拍照讲究最终成像的快和准录像讲究长时间稳定运行不发热不丢帧。两条线的优化思路完全不同但都离不开对整条Pipeline的拆解。3.1 连拍性能与JPEG输出的时延拆解先看拍照这条线。单帧拍照的时延主要花在三个地方请求排队等待、ISP处理输出RAW/YUV、JPEG编码器压缩输出。用户按下快门那一刻如果当前预览Session正忙Capture Request需要排队传感器曝光时间长短也有直接关系暗光环境下曝光时间延长时延自然就高。这些环节叠加起来就会出现按下快门到相册看到成片之间的卡顿感。优化思路有这么几个拍照和预览分开走不同的Stream不要让拍照请求打断预览流水线。比如通过SessionConfiguration配置两个Surface一个干活预览一个专门用于拍照避免相互阻塞。JPEG编码不要堵在主链路上。JPEG编码是计算密集型的如果直接在拍照请求的ImageReader回调里同步做编码主线程很容易被拖垮。正确姿势是把编码放到后台线程池而且尽量用硬件编码器ImageWriterMediaCodec避免纯CPU软件编码。连拍场景考虑无损压缩格式替代JPEG。像HEIFHeic在高端机型上支持硬件编码同样的画质体积只有JPEG的一半IO和内存的压力都更小。如果目标机型不支持HEIC也可以考虑WebP。利用沉浸式连拍In-sensor HDR / Burst。部分SoC的ISP支持非常快速的连拍模式比如90FPS/120FPS的快速帧捕获可以把多帧合成HDR的效果又不用等CPU慢慢处理。这块做得好连拍时的掉帧感会小很多。拍照时延这个指标在系统评测里也很常见打开相机后连拍10张看每张的timestamp间隔和图质量。如果发现第5张之后间隔拉大大概率是JPEG编码积压了后面我会在排查实录里再详细说。3.2 录像编码器配置与码控策略录像的性能优化核心在编码器。硬件编码器MediaCodec负责把Camera的帧序列编码成H.264/H.265/VP9/AV1视频流你设置的参数直接决定了功耗、发热和画质。关键参数有这么几个码率Bitrate码率越高画质越好但编码器负载和文件体积也跟着涨。要考虑存储和网络传输的需求做平衡没有绝对标准。帧率Frame RateHAL输出帧率、编码器输入帧率、显示刷新率三者最好能对齐。如果录制4K60那整个Pipeline从Sensor到编码器都必须稳定支持60FPS才行。I帧间隔GOP LengthI帧是视频的关键帧体积大但通常不需要调太密默认值很多时候已经够用。编码配置文件/profile非要支持H.264 High Profile会带来兼容性问题而且功耗也不会低。如果设备是老机型High Profile的解码能力未必有保障。所以选profile要兼顾解码器的兼容性优先适配广泛的设备。码控模式CBR恒定码率码率平稳适合视频通话和直播VBR可变码率可以在画质优先的场景中提供更好质量。很多相机录像默认用VBR但长时间录像下CBR对发热控制更有帮助因为编码器负载更稳定。我建议长时间录像场景尤其是4K以上默认用CBR码率不要顶到上限留15%~20%的余量给编码器的瞬时峰值。这样虽然画面动态范围大的时候会有一点码率压力但整机的温度控制会好很多。温控这块后面还会展开讲。另外新一代编码标准如H.265/HEVC、AV1在同等画质下体积更小但编码器复杂度更高功耗也更高。如果项目对功耗敏感H.264往往是更稳妥的选择如果更看重存储空间占用量支撑硬件编码H.265的机型可以优先用H.265。3.3 算法集成场景下的嵌入式性能调优现在美颜、人脸检测、背景虚化、AI识别这些算法几乎成了Camera标配。这些算法一上来性能问题立刻变得复杂因为Camera Pipeline不再是简单的Sensor→ISP→显示而是Sensor→ISP→算法处理→显示/编码算法推理的耗时直接插在帧与帧之间。算法集成要注意几个点推理框架的选型。常见的有NCNN、MNN、TNN、TensorFlow Lite等。不同框架在高通、联发科、海思等不同平台上的表现千差万别不能只看benchmark一定要拿目标机型实测。实测重点关注推理耗时波动有些框架在冷启动时方差很大跑几帧后才会稳定下来。NPU/DSP/GPU的调度。如果SoC带NPU尽量把模型部署到NPU上。但要注意NPU驱动和Camera的HAL共用一个电源域高温时可能会互相牵扯。我见过一次NPU长时间推理导致Camera帧率波动的情况最后是给NPU任务加了降频策略才稳下来。数据格式转换是隐形杀手。算法通常要RGB输入而Camera输出是YUV每帧做NV21→RGB转换60FPS时就是每16ms就要转一次。这个转换如果用CPU做纯运算耗时可达5ms甚至更高对帧率影响非常大。优化办法是能走GPU的用Shader转能直接在数据源上做算法的就用ISP输出的YUV格式直接处理减少格式转换次数。更进一步部分SoC的ISP支持在硬件上完成色彩空间转换输出RGB这样算法拿到的就是RGB省掉CPU/GPU的转换开销功耗和时延都更优。如果算法SDK支持YUV输入也优先用YUV格式直接推理。驱动和系统层优化。在嵌入式Linux/Android系统级优化里这块还涉及V4L2设备节点配置、设备树里Camera sensor节点的属性调整、GPIO和I2C中断的整理裁剪、以及系统裁剪时去掉不必要的后台服务。内核日志里v4l2的调用耗时、中断触发频率、内存碎片情况都可能成为性能瓶颈。裁剪系统就是为了腾出CPU和内存给Camera链路同时减少不必要的电源唤醒源这比在App层做优化来得更根本。4. 性能数据采集与定位工具链只说思路不给方法是耍流氓。优化的前提是有数据支撑而不是靠感觉。Android生态里好用的性能工具不少这里我把每个阶段最顺手的组合列出来。4.1 Android Studio ProfilerCPU与GPU瓶颈快速定位Android Studio自带的Profiler是上手最快的工具。它可以观察CPU、内存、网络、能耗对Camera场景最重要的是CPU和内存两个面板。用法建议连接真机不要用模拟器因为Camera行为在模拟器上根本不真实。在Profiler里选择Camera App进程开始录制CPU记录。录制的时长不用太长10~20秒足够。操作相机App切换到预览、拍几张照片、录一段视频覆盖主要场景。录制结束后在CPU时间线上找峰值和耗时长的调用栈。重点看Camera相关线程名Camera2、Camera3、ImageReader、PreviewRequestThread。如果某个线程长期占用高CPU或者阻塞了主线程调用栈直接看得到。内存面板里看Java Heap分配曲线如果频繁出现锯齿状的GC尖峰说明在循环里做了大量短生命周期对象分配——这往往是Buffer管理不当或者每帧都创建局部对象导致的问题。Profiler定位到代码层面之后就可以针对性地优化了。比如发现ImageReader的回调里做了大量ByteBuffer到Bitmap的转换导致CPU偏高就可以考虑走GPU或者调整消费策略。4.2 Perfetto/Systrace一帧里的时间都去哪了系统级分析我更喜欢用Perfetto旧版是Systrace。它能拿到内核、SurfaceFlinger、HAL、App所有线程的时间线把一帧的生命周期完整串起来。看Camera掉帧问题最重要的就是确认这一帧耗时卡在哪个节点。常用操作# 抓取trace包含camera、surfaceflinger、input等tag perfetto -o /data/misc/perfetto-traces/trace.perfetto-trace \ -c - --txt \ EOF buffers { size_kb: 65536 fill_policy: RING_BUFFER } data_sources { config { name: linux.process_stats } } data_sources { config { name: android.surfaceflinger.frametimeline } } data_sources { config { name: android.hardware.camera } } data_sources { config { name: android.hardware.graphics.mapper } } duration_ms: 10000 EOF当然这个命令在部分低版本设备上不支持直接跑。如果设备上没装Perfetto CLI可以走Android Studio的System Trace录制或者用老版的systrace.pypython systrace.py -t 10 -o trace.html \ camera idle freq gfx view sched wm am input hal抓完之后在Perfetto UI里点击掉帧的时段看几件事BufferQueue的状态producer和consumer是不是长期处于wait状态SurfaceFlinger的合成耗时如果composite阶段长通常GPU负载过高Camera HAL线程的块耗时如果长时间block在buffer wait上HAL输出能力输出受阻主线程的Choreographer回调耗时看App侧有没有在vsync回调里做了太重的工作。4.3 dumpsys系列黑盒设备上的快速体检在没有Android Studio环境或者需要快速远程排查机器问题时dumpsys是神器。几个最常用的# 查看Camera服务状态 adb shell dumpsys media.camera # 查看SurfaceFlinger合成和layer信息 adb shell dumpsys SurfaceFlinger --latency # 查看窗口和Surface信息 adb shell dumpsys SurfaceFlinger # 查看App内存和GC情况 adb shell dumpsys meminfo package_name adb shell dumpsys gfxinfo package_name # 查看CPU各核负载和频率 adb shell cat /proc/stat adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_statedumpsys media.camera能看到当前打开的Camera设备、活跃的流配置、Buffer数量、各请求的耗时统计。如果HAL挂了或者stream配置有问题这里通常有明确错误码。dumpsys SurfaceFlinger --latency能统计Surface的帧时间戳是掉帧问题的直接证据。经常用到的还有一个技巧连续执行两次dumpsys看哪些线程或GPU频率有明显变化用来判断是瞬时负载还是持续负载。榜单上还经常出现Camera相关的VTS测试这个我多说一句。VTSVendor Test Suite是Android兼容性测试的一个重要组成部分重点验证HAL层与框架的接口是否合规。Camera VTS里比较常见的失败场景就是流切换后HAL卡住不释放、Request超时、Buffer迟到这些问题和图像质量无关通常是Buffer管理、HIDL接口时延、流配置切换策略的问题。跑VTS之前我先自查这几个点每个stream都设置合理数量的BufferRequest的模板参数符合规范处理Stream切换时回调时序正确不要出现资源竞争。5. 常见问题与排查技巧实录最后这部分是目前项目里最高频踩坑的场景直接整理成速查表和实战记录。5.1 高频故障速查表故障现象常见原因排查/解决路径预览黑屏/无帧Surface未就绪、权限不足、Camera open失败确认Surface是否valid查看CameraDevice回调错误码dumpsys media.camera看流状态预览掉帧Buffer分配GC、SurfaceFlinger合成慢、热降频Perfetto看掉帧点检查ImageReader消费策略观察CPU/GPU负载拍照明显卡顿JPEG编码在主线程、Buffer数量不足、Request排队把编码移到后台线程池配置专用拍照Stream适当增加Buffer录像中途掉帧编码器负载高、散热降频降低码率用CBR码控给CPU/GPU设温控阈值三方App拍照闪退格式/尺寸不支持、权限拒绝、FileProvider配置错误检查HAL支持的Stream配置重点验证YUV_420_888检查PRIVATE格式兼容连拍后第N张掉帧编码器处理不过来、Buffer积压使用硬件编码器调整Buffer数量降低JPEG输出分辨率这里要特别提一下很多人遇到掉帧第一反应是优化算法逻辑但实测中我好几次最后发现是系统进程android.process.media在后台跑媒体扫描CPU被占满了。所以看问题不要只盯着自己的App进程把全机负载扫一遍再动手往往事半功倍。5.2 三方App适配与存储访问权限和路径那些坑三方App的Camera适配问题尤其是在国产ROM上很常见。热搜里出现了大量的content://协议、fileprovider路径相关的字符串说明很多开发者都在处理类似的问题。这里我重点说两个方向Camera权限与API差异Android 6.0之后运行时权限是标配了但很多App在Android 12的机型上还是会出现权限拒绝但应用不提示的情况。Camera权限被拒绝后CameraDevice回调会给ERROR_CAMERA_DISABLED或者ERROR_CAMERA_DEVICE_IN_USE。建议把权限申请和Camera open失败的两个回调都做好用户引导不要把权限失败直接当Crash处理。API方面CameraX是官方推荐的库但在Camera2的高级特性上支持还不完整。如果App重度依赖多路输出、RAW流、自定义Request参数最终还是要走Camera2 API。做系统/HAL适配时一定要保证Camera2 API的基础能力是完整的——Stream配置正确性组合要合理、格式支持要全、Request模板的有效性、Buffer的吞吐能力这些在VTS里都有覆盖通过VTS大致能说明API层面是符合规范的。FileProvider与存储目录适配相机App拍完照片或录完视频经常需要通过FileProvider提供给其他App处理。这里面的坑非常多。常见的问题就是App把自己的收件箱/相册路径配置成了一个content://URI但权限声明不完整或者目录文件是在外部存储卡上FileProvider在Android 11的MANAGE_EXTERNAL_STORAGE策略下拿不到路径。遇到这种问题排查顺序是先确认AndroidManifest.xml里FileProviderprovider配置合法meta-data指向的file_paths资源路径是否存在。确认external-path、external-files-path等路径是否和实际目录匹配。external-files-path映射的是/storage/emulated/0/Android/data/package/files如果你代码里用了Environment.getExternalStorageDirectory()那对应的是external-path而不是external-files-path配置错主题的话权限自然就失效。在Android 11如果目标App不满足包可见性要求对方Activity通过URI读取文件也可能被系统拦截。这种情况需要在AndroidManifest.xml里声明queries元素让需要看到的目标包可见。给系统应用做Camera适配时还经常遇到content://URI跨进程共享时权限Flags不足的问题。生成URI的时候必须显式加上Intent.FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION否则接收方就只看到一个空URI什么都读不了。5.3 发热与功耗录像久了的帧率保卫战Camera的功耗大户其实很明确Sensor供电、ISP处理、编码器、GPU合成和屏幕。长时间录像场景下哪个部件都不省油。很多项目的解决方式是整体降频结果画质和帧率一起被牺牲掉。我的经验是优先做差分优化先用功耗工具锁到具体是哪个模块在发热突出。如果主要是编码器热量就降编码码率如果主要是ISP处理高分辨率导致就把录像分辨率降到1080P如果是屏幕常亮导致就适当降低屏幕亮度或者在UI上做夜景模式。不要一上来就全局降频宁可牺牲一部分画质也要保住帧率的稳定感知。另外温控策略要给Camera留出缓冲比如在温度到达上限之前就逐步降码率而不是等到临界点一刀切这样用户的感知是画质慢慢变差而不是突然一下掉帧卡顿。关于温度监控Android里有Thermal HAL可以读取温度状态代码里可以通过PowerManager的addThermalStatusListener实现监听做动态码控或者提示用户。6. 工具链组合和性能优化的完整执行流前面把零散的工具都介绍了最后串一条完整的执行参考。一个典型的Camera性能问题排查流程应该这样走先复现量化问题。通过Profiler或者logcat记录FPS掉帧时刻确认复现路径。系统级trace定位。Perfetto/Systrace抓trace确认掉帧是在哪一层发生的。区分方向CPU问题算法、编码、GC、GPU问题合成、渲染、HAL问题ISP、Sensor、Buffer、系统资源问题热、内存、IO。针对优化每类问题用对应手段优化改完重新跑同一条链路对比数据。稳定性验证长时间跑录像、连拍测试配合VTS和压力测试确认没有回归。这条流程说起来简单但真正难的是每一步都有足够多的数据支撑。优化最忌讳的就是“猜”。我见过团队花了两周改采集算法最后发现问题是手机自带相册后台自动备份导致IO繁忙——如果一开始就抓trace看整体负载半天就能定位到。另外代码层面一定要建立性能回归的自动化测试基线。比如给每个版本跑一次Camera启动时延、预览帧率、拍照时延、录像30分钟帧率曲线这几个指标把数据存到CI系统里。这样每次HAL升级或者代码改动后有没有性能回归看一眼对比曲线就知道了。这块我之前用Python脚本读dumpsys SurfaceFlinger --latency的输出生成帧率表再用adb shell dumpsys gfxinfo读掉帧统计成本不高但收益很稳。落实到团队协作上我建议视觉、算法、媒体、驱动各端共同建一套维护这个基线的机制不然经常是这一版优化了算法在8Gen平台上跑得好下个版本换了个中端SoC就又不行了。性能优化不是一锤子买卖长期做沉淀才能把效果守得住。7. 写在最后的项目经验做Camera性能优化这些年我自己体会最深的一点是性能问题表面上是技术问题本质上是系统性问题。Camera链路横跨App、Framework、HAL、驱动、硬件任何一个环节出问题都会在手机上体现为掉帧、卡顿、发热。所以遇到问题不要急着改代码先把整条链路读一遍把数据抓全再动手。另外还有个习惯想推荐对每个性能问题都保留一份完整的“复现脚本trace文件结论记录”。因为这个领域的问题经常是过了几个月又出现如果当时记录足够完整定位时间能缩短一半。还有一个细节是不同SoC平台的Camera HAL差异非常大高通的调试代码在联发科上不一定跑得通反过来也一样所以在项目早期就要确定主要目标平台避免通用方案两头不讨好。希望上面这些内容能给正在做Camera性能优化的你一些帮助。
返回列表