做网站都有哪些费用,佛山关键词优化服务,平面设计主要做什么ui,专业网站定制流程“ BufferQueue作为连接生产者和消费者的桥梁#xff0c;时刻掌握队列中每一块Buffer的状态#xff0c;对于解决一些卡死卡顿问题很有帮助#xff0c;辨别是否有生产者或消费者长期持有大量Buffer不放导致运行不畅的情况。” 01
—
前言 在Android系统中#xff0c;应用U…“ BufferQueue作为连接生产者和消费者的桥梁时刻掌握队列中每一块Buffer的状态对于解决一些卡死卡顿问题很有帮助辨别是否有生产者或消费者长期持有大量Buffer不放导致运行不畅的情况。” 01
—
前言 在Android系统中应用UI的显示、播放器解码后画面的显示、Camera预览画面的显示最终都是要送到Graphics系统的流程完成最终的合成送显所以在出现画面卡顿卡死问题时Graphics系统往往成为背锅侠。
因此我们要学会如何快速精准地理清问题(“甩锅”)。
最近遇到一些播放相关的问题
player的小伙伴认为是decode时dequeue不出新的buffer导致解码流程卡住
graphics的小伙伴认为是decoder长期持有大量的buffer导致显示合成卡住
那有没有办法可以实时监测下当前BufferQueue的状态呢我简单研究了下有点发现但未必完美在此分享下供大家讨论
建议小伙伴们先阅读下早前BufferQueue的讲解文章
Android Graphics 显示系统 - BufferQueue的工作流程十二
Android Graphics 显示系统 - BufferQueue的工作流程十三
Android Graphics 显示系统 - BufferQueue的工作流程十四
Android Graphics 显示系统 - BufferQueue的工作流程十五 在正常的显示流程中每一块buffer的状态会进行转换
FREE - DEQUEUED - QUEUED - ACQUIRED - FREE 监测下当前BufferQueue的状态目标就是获取当下队列中分配了多少了块Buffer以及每一块Buffer所处的状态是什么 02
—
演示效果 使用原生gallery3d app播放视频时抓到的BufferQueue的状态信息
06-22 10:14:04.297 3400 3427 E BufferQueue: State: [SurfaceView[com.android.gallery3d/com.android.gallery3d.app.MovieActivity]#11(BLAST Consumer)11]
06-22 10:14:04.297 3400 3427 E BufferQueue: - BufferQueue mMaxAcquiredBufferCount1 mMaxDequeuedBufferCount15
06-22 10:14:04.297 3400 3427 E BufferQueue: mDequeueBufferCannotBlock0 mAsyncMode0
06-22 10:14:04.297 3400 3427 E BufferQueue: mQueueBufferCanDrop0 mLegacyBufferDrop1
06-22 10:14:04.297 3400 3427 E BufferQueue: default-size[720x1280] default-format4 transform-hint00 frame-counter84
06-22 10:14:04.297 3400 3427 E BufferQueue: mTransformHintInUse00 mAutoPrerotation0
06-22 10:14:04.297 3400 3427 E BufferQueue: FIFO(1):
06-22 10:14:04.297 3400 3427 E BufferQueue: (mConsumerNameSurfaceView[com.android.gallery3d/com.android.gallery3d.app.MovieActivity]#11(BLAST Consumer)11, mConnectedApi3, mConsumerUsageBits2304, mIdd480000000b, producer[532:???], consumer[3400:com.android.gallery3d])
06-22 10:14:04.297 3400 3427 E BufferQueue: 15:0x7756e78afd10 crop[0,0,720,1280] xform0x00 time1049.6518 scaleSCALE_TO_WINDOW
06-22 10:14:04.297 3400 3427 E BufferQueue: Slots:
06-22 10:14:04.297 3400 3427 E BufferQueue: [00:0x7756e78ad490] stateDEQUEUED 0x7756278c19d0 frame75 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [01:0x7756e78c2190] stateDEQUEUED 0x7756278d0230 frame71 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [02:0x7756e78bf010] stateDEQUEUED 0x7756278c5de0 frame74 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [03:0x7756e78c2df0] stateDEQUEUED 0x7756278c4680 frame80 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [04:0x7756e78b0df0] stateDEQUEUED 0x7756278d02e0 frame70 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [05:0x7756e78c4e90] stateDEQUEUED 0x7756278cf310 frame72 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [06:0x7756e78b82f0] stateDEQUEUED 0x7756278d7030 frame73 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [07:0x7756e78c10b0] stateDEQUEUED 0x7756278d6e20 frame76 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [08:0x7756e78c7950] stateDEQUEUED 0x7756278cfcb0 frame77 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [09:0x7756e78c61b0] stateDEQUEUED 0x7756278d4f30 frame78 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [10:0x7756e78bf910] stateDEQUEUED 0x7756278d5980 frame79 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [11:0x7756e78af890] stateACQUIRED 0x7756278c6570 frame81 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [13:0x7756e78b7d50] stateDEQUEUED 0x7756278c94e0 frame67 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [14:0x7756e78c22b0] stateACQUIRED 0x7756278c54f0 frame83 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [15:0x7756e78afd10] stateQUEUED 0x7756278c9590 frame84 [ 768x1280: 768,32315659]
06-22 10:14:04.297 3400 3427 E BufferQueue: [12:0x7756e78ad370] stateFREE 0x7756278d7b30 frame82 [ 768x1280: 768,32315659]可以看到 一共分配了16块buffer 2块buffer处于ACQUIRED状态说明已被消费者拿去准备合成显示了 1块buffer处于QUEUED状态说明生产者已经queueBuffer返还了 1块buffer处于FREE状态 12块buffer处于DEQUEUED状态说明生产者dequeueBuffer准备填充数据 还可以看到每一块buffer的width/height/stride/format framexx代表了该buffer被queueBuffer的顺序即为BufferSlot中的 // mFrameNumber is the number of the queued frame for this slot. This// is used to dequeue buffers in LRU order (useful because buffers// may be released before their release fence is signaled).uint64_t mFrameNumber;另外还有BufferQueue的配置信息 使用原生gallery3d app展示图片时抓到的BufferQueue的状态信息 06-22 11:24:40.224 3400 9472 E BufferQueue: State: [SurfaceView[com.android.gallery3d/com.android.gallery3d.app.GalleryActivity]#29(BLAST Consumer)29]
06-22 11:24:40.224 3400 9472 E BufferQueue: - BufferQueue mMaxAcquiredBufferCount1 mMaxDequeuedBufferCount2
06-22 11:24:40.224 3400 9472 E BufferQueue: mDequeueBufferCannotBlock0 mAsyncMode0
06-22 11:24:40.224 3400 9472 E BufferQueue: mQueueBufferCanDrop0 mLegacyBufferDrop1
06-22 11:24:40.224 3400 9472 E BufferQueue: default-size[1080x1776] default-format3 transform-hint00 frame-counter414
06-22 11:24:40.224 3400 9472 E BufferQueue: mTransformHintInUse00 mAutoPrerotation0
06-22 11:24:40.224 3400 9472 E BufferQueue: FIFO(1):
06-22 11:24:40.224 3400 9472 E BufferQueue: (mConsumerNameSurfaceView[com.android.gallery3d/com.android.gallery3d.app.GalleryActivity]#29(BLAST Consumer)29, mConnectedApi1, mConsumerUsageBits2304, mIdd480000001d, producer[3400:com.android.gallery3d], consumer[3400:com.android.gallery3d])
06-22 11:24:40.224 3400 9472 E BufferQueue: 02:0x7756e78c73b0 crop[0,0,0,0] xform0x00 time5285.5555 scaleSCALE_TO_WINDOW
06-22 11:24:40.224 3400 9472 E BufferQueue: Slots:
06-22 11:24:40.224 3400 9472 E BufferQueue: [00:0x7756e78b7210] stateACQUIRED 0x7756278cf050 frame412 [1080x1776:1088, 1]
06-22 11:24:40.224 3400 9472 E BufferQueue: [01:0x7756e78c0210] stateACQUIRED 0x7756278c3ad0 frame413 [1080x1776:1088, 1]
06-22 11:24:40.224 3400 9472 E BufferQueue: [02:0x7756e78c73b0] stateQUEUED 0x7756278d0e90 frame414 [1080x1776:1088, 1]03
—
方法及源码 现在的方法是把BufferQueue的状态信息直接打印到logcat中通过设置一个属性值来指定需要打印哪一个BufferQueue的信息。
源码
阅读原文获取
Android Graphics 显示系统 - BufferQueue的状态监测