Android Display性能问题教战手册2

系列文章请扫关注公众号!

Android Display Graphics系列文章-汇总

本文主要包括部分:

1、BufferQueue

1.1 BufferQueue Common Tag

1.2 GPU Compostion & HWC release Tag

1.3 BufferQueue Rotate

1.4 dequeueBuffer & queueBuffer

1.5 BufferQueue DebugLog

1.6 HWC dequeueBuffer

本文主要讲解BufferQueue相关的调试技巧,通过图文详解各个关键分析点。1.5 根据源码增加debug信息,快速定位Buffer情况。

1.1 BufferQueue Common Tag

BufferQueue是贯穿整个显示运作的:

  ●  前面介绍过dequeuequeue的位置,S版上由BlastBufferQueue总管整个BufferQueue的运作,Consumer也被拔到了上层

  ●  图中可以看到在queueBuffer的同时,就已经会发起acquireBuffer

  ●  SF将这块Buffer拿走处理以后,会透过releaseBufferCallback将另外一块前面已经用完的Buffer release出来

从上面介绍可知,BufferQueue会有N块Buffer在轮转使用,在某个场景下使用多少块Buffer才能轮转流畅,需要根据场景的情况来调整,

看问题时首先要快速知道这个场景使用了多少个Buffer:

1.2 GPU Compostion & HWC release Tag

要点概述:

这两个Tag是Monitor  LayerFence(acquireFence/releaseFence)状态的

1,前面介绍过,这两个Tag通常和BufferQueue一起出现,对于理解BufferQueue的行为和分析问题,正确理解这两个Tag非常重要:

GPU completion:   字面上理解就是等GPU绘制完成,Signal AcquireFence 

HWC release:  字面上理解就是等HWC合成使用完毕,Signal ReleaseFence

2,由代码可知这两个Tag填入的出处在GUI Surface的dequeueBufferqueueBuffer:

  1. 而真正打印这个Trace是在FenceMonitor的Thread中:

  ●  由此可以知道这两个Tag并不是代表真正的Fence,而是一个monitor Fence,track Fence状态的Tag

  ●  它monitor的是某一个Surface所用Buffer的Fence,也就是LayerFence的状态

  ●  如果在这个monitor thread开始之前LayerFence已经被Signal了,则这两个Tag就不会出现

       a) dequeueBufferqueueBuffer最后出现(fence %u has signaled),GPU completion & HWC release里就不会出现waiting

       b) dequeueBufferqueueBuffer最后出现(Trace %s fence %u),  GPU completion & HWC release里就会出现waiting

  ●  waiting for GPU completion和waiting for HWC release后面的数字是Fence计数的idx, 但互相之间相同的数字没有直接固定的对应关系,

     还是要通过dequeueBufferqueueBuffer最后带的Tag来对应

1.3 BufferQueue Rotate

要点概述:

BufferQueue的核心逻辑就是Buffer的轮转使用,分析问题必须要学会通过Trace看BufferQueue轮转的状况

  •  在对BufferQueue的Tag有了清楚的认知以后,需要了解BufferQueue的轮转会怎样体现出来

     1,如下图就是典型的体现轮转的Trace,第一个圈的 #4 Buffer 被SF使用,一直到A点才被显示到panel上

     2,按照我们对A点意义的认知,到下一帧被显示出来的B点,#4 才不需要在被用到,presentfence被放掉,

        其用到的BufferLayerFence才能被signal

     3,可以看到在第二个圈 #4 Buffer第二次dequeue的时候,还没有到B点,所以出现了H1waiting for HWC release的等待

  •  所以通过分析我们可以知道,出现waiting for HWC releaseBufferQueue开始出现轮转压力的标志

     一旦出现轮转压力,当次后面dequeueBufferwaiting for GPU completion很容易被影响到,

     所以常常看见HWC release先出现后一定会同时出现GPU completion

  •  如果是由于GPU绘制慢影响到整体的,那么应当是先单独出现waiting for GPU completion(谁先出现问题很重要)

 

BufferQueue轮转Buffer的数量是如何决定的?

完整文章请关注移步公众号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值