1. Touch Latency为硬件时间(Touch IC latency)和软件时间(Android pipeline latency)总和。MTK分析时以软件时间为主。
- Touch IC latency和客户选料及FW调优有关。客戶需要提供vendor IC latency数据,请协助客戶保证Touch IC latency不输对比机。
- Android pipeline latency差异主要源于Android S版及R版流程差异, Android S新增Latch signaled buffer及SF backpressure机制,造成Android S0平台出图流程较R慢约15ms。
2. Android touch event flow
2.1 Touch IC hardware time
Touch IC detect event, CPU收到irq时,唤起mtk-tpd thread,进行I2C/SPI读取TP数据后,上报到input event:
抓Systrace时打开了input event,会在system_server看到 iq 和 InputReader信息:
如上图,手指按下时可以看到 dispatchPtr:Down,手指离开TP时可以看到 dispatchPtr:Up。
2.2 Android input system
InputReader读取Input事件,唤醒InputDispatcher,由 InputDispatcher分派事件给对应的app处理
2.3 App rendering
在Vsync到时,App的UI thread被Input事件唤醒,并标有deliverInputEvent; App进行逻辑运算,根据点击/滑动做出对应的出图(render thread queueBuffer)
2.4 Android graphics system
在Vsync到时,SurfaceFlinger消耗buffer并通知HWC叠图;OVLEngine叠完图并上传显示资料至Display区显示
2.5 比如某个平台在120Hz Vsync下的Touch Flow,Android total pipeline latency ~= 59.426 ms
3. Solution参考
3.1 Touch IC hardware time优化,这个要咨询TP的vendor是否可用优化
3.2 可用在APP白名单中配置TOUCH BOOST参数,比如:
<data cmd="PERF_RES_POWERHAL_TOUCH_BOOST_ENABLE" param1="1"></data>
<data cmd="PERF_RES_POWERHAL_TOUCH_BOOST_CLUSTER_0_OPP" param1="3"></data> // CPU cluster0 freq opp,档位0 对应CPU最高频率,如果功耗高,请修改为3,4,5 ..等
<data cmd="PERF_RES_POWERHAL_TOUCH_BOOST_CLUSTER_1_OPP" param1="3"></data> // CPU 中核freq opp,档位0 对应CPU最高频率,如果功耗高,请修改为3,4,5 ..等
<data cmd="PERF_RES_POWERHAL_TOUCH_BOOST_ACTIVE_TIME" param1="20"></data> // fpsgo控频的情況下,20ms不出帧,touch boost才可能生效。如果让touch boost立即生效,可使用 active_time=1,但可能会增加功耗
scenario powerhint "INTERACTION" //这个主要在手指未离开TP情况下,连续滑动场景下起作用
vendor/mediatek/proprietary/hardware/power/config/mt6***/scn_tbl/powerscntbl.xml
<scenario powerhint="INTERACTION">
<data cmd="PERF_RES_CPUFREQ_MIN_CLUSTER_0" param1="2000000"></data>
<data cmd="PERF_RES_CPUFREQ_MIN_CLUSTER_1" param1="2000000"></data> // 设置CPU 大小核min freq,要求的最小频率可以自己调整
<data cmd="PERF_RES_DRAM_OPP_MIN" param1="1"></data> //设置dram
</scenario>
scenario powerhint "MTKPOWER_HINT_APP_TOUCH" //这个是 touch down ---- touch up, 中间起作用
<scenario powerhint="MTKPOWER_HINT_APP_TOUCH">
<data cmd="PERF_RES_CPUFREQ_MIN_CLUSTER_0" param1="1500000"></data>
<data cmd="PERF_RES_CPUFREQ_MIN_CLUSTER_1" param1="1800000"></data>
<data cmd="PERF_RES_CPUFREQ_CCI_FREQ" param1="1"></data>
<data cmd="PERF_RES_DRAM_OPP_MIN" param1="1"></data>
<data cmd="PERF_RES_SCHED_UCLAMP_MIN_TA" param1="60"></data>
</scenario>
Touch boost会增加功耗,所以需要客户自行评估是否要添加touch boost...
3.3 可调小sf-duration,需要SurfaceFlinger owner 确认