1# 帧渲染数据解析的逻辑 2帧的解析分为应用帧的解析和渲染帧的业务解析。 3## 应用帧 4应用帧解析主要是进行应用帧业务的开始和结束,并对其帧编号进行记录,以便在RS的业务中进行匹配(RenderService简称为RS)。 5应用帧会有下面一些调用栈: 6H:ReceiveVsync 7H:OnVsyncEvent 8H:MarshRSTransactionData 9H:ReceiveVsync包含H:OnVsyncEvent, H:OnVsyncEvent包含H:MarshRSTransactionData. 10特别地,当一个栈没有H:MarshRSTransactionData事件时,是无效的帧。 11H:MarshRSTransactionData内会包含线程号和应用的帧标号。 例如: H:MarshRSTransactionData cmdCount:3 transactionFlag:[32402,146] 12## 渲染帧 13渲染帧会有下面一些调用栈: 14H:ReceiveVsync 15H:RSMainThread::DoComposition 16H:RSMainThread::ProcessCommandUni 17H:ReceiveVsync包含H:RSMainThread::DoComposition, H:RSMainThread::DoComposition包含H:RSMainThread::ProcessCommandUni. 18特别地:当渲染帧不包含H:RSMainThread::ProcessCommandUni时,为无效的渲染帧。 19H:RSMainThread::ProcessCommandUni内包含被渲染帧所属的线程号和帧编号。例如: H:RSMainThread::ProcessCommandUni [32402,146] 20## 应用帧和渲染帧关联 21应用帧和渲染帧通过H:MarshRSTransactionData和H:RSMainThread::ProcessCommandUni事件挟带的[tid, id]关联。 22## 应用帧数据计算 23expect: 开始时间为应用帧H:ReceiveVsync事件中now字段指定的时间, 结束时间为end字段指定的时间。 24 需要注意这里的now和end指定的时间并非boottime,需要经过时钟同步后使用。 在文本格式的数据中无时钟源信息,所以无法进行时钟同步。进而导致文本和htrace解析结果不一致。 25actural: 开始时间为应用帧H:ReceiveVsync事件B子事件发生时间,结束时间为应用帧H:ReceiveVsync事件E子事件发生时间。 26## 渲染帧数据计算 27expect: 开始时间为渲染帧H:ReceiveVsync事件中now字段指定的时间, 结束时间为end字段指定的时间。 28 需要注意这里的now和end指定的时间并非boottime,需要经过时钟同步后使用。 在文本格式的数据中无时钟源信息,所以无法进行时钟同步。进而导致文本和htrace解析结果不一致。 29actural: 开始时间为渲染帧H:ReceiveVsync事件B子事件发生时间,结束时间为渲染帧H:ReceiveVsync事件E子事件发生时间。 30## FrameTimeline的数据计算 31expect: 开始时间为应用帧expect的开始时间, 结束时间为渲染帧expect的结束时间。 32actrual: 开始时间为应用帧H:ReceiveVsync事件B子事件发生时间,结束时间为渲染帧H:ReceiveVsync事件E子事件发生时间。 33## GPU渲染时长 34和渲染帧同步并发的,是渲染线程的gpu信息,在事件中是H:M: Frame queued事件。 35只有当H:M: Frame queued事件的开始时间在渲染帧的H:ReceiveVsync时间的开始到结束的时间范围时,将该H:M: Frame queued事件和H:ReceiveVsync做关联,两者构成一个完整的渲染事件(也可能没有H:M: Frame queued事件)。 36而应用的渲染帧编号,和渲染线程中H:RSMainThread::ProcessCommandUni事件所携带的被渲染的帧编号,所属的线程号关联之后,形成应用帧的一个完整渲染事件。 37## 关于帧卡顿的定义 38关于帧卡顿的定义:帧的实际渲染时间晚于期望被渲染的时间,认为帧卡顿。数据库中标识为1,否则为0。 39期望帧不做任何标识,为默认的255(max u8),导出db时为空。 40特别地:以上事件发出的线程,必须是进程中的主线程,即线程号和进程号一致,否则,不做处理。 41另外,|渲染帧actural开始时间 - 应用帧actural结束时间| > 1ms时, 认为渲染状态异常。 数据库中标识为3. 42## 关于无效帧的定义 43如果应用帧不包含FrameNum,则其为无效帧。 44无效帧的标识为2。 45当帧为无效帧时,会同时标识其实际帧和期望帧为无效帧。