TV UI foundation
This commit is contained in:
@@ -29,3 +29,15 @@ for s in json.load(sys.stdin):
|
||||
aout() { $A shell dumpsys media.audio_flinger | grep -E "^Output thread|Total writes|Tracks of which"; }
|
||||
# Журнал локального прокси VLC (диапазоны, кэш, сколько скачано с сервера)
|
||||
vproxy() { $A logcat -d | grep "VLC proxy" | sed -E 's/^[0-9-]+ ([0-9:.]+).*VLC proxy/\1/' | cut -c1-170; }
|
||||
# Замер плавности интерфейса (только на release-сборке!): ui_bench [right|down] [N]
|
||||
# Листает ряд (или экран) вперёд и назад N раз и печатает перцентили кадра и GPU, затем разбивку по фазам.
|
||||
ui_bench() {
|
||||
local dir=${1:-right} n=${2:-8} back P=ru.stenfredd.movies
|
||||
[ "$dir" = right ] && back=left || back=up
|
||||
$A shell dumpsys gfxinfo $P reset >/dev/null
|
||||
for i in $(seq 1 $n); do $A shell input keyevent DPAD_${dir^^}; sleep 0.35; done
|
||||
for i in $(seq 1 $n); do $A shell input keyevent DPAD_${back^^}; sleep 0.35; done
|
||||
$A shell dumpsys gfxinfo $P | grep -E 'Janky frames:|50th percentile|90th percentile|99th percentile|50th gpu|90th gpu'
|
||||
$A shell dumpsys gfxinfo $P framestats | python3 tools/tv/framestats.py
|
||||
}
|
||||
install_release() { ./gradlew :app:assembleRelease -q && $A install -r app/build/outputs/apk/release/app-release.apk; }
|
||||
|
||||
24
tools/tv/framestats.py
Normal file
24
tools/tv/framestats.py
Normal file
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env python3
|
||||
# Разбивка времени кадра по фазам из `adb shell dumpsys gfxinfo <пакет> framestats` (stdin), см. ui_bench в env.sh.
|
||||
import sys, statistics as st
|
||||
lines=sys.stdin.read().splitlines()
|
||||
hdr=None; rows=[]
|
||||
for l in lines:
|
||||
if l.startswith('Flags,'): hdr=l.strip().strip(',').split(','); continue
|
||||
if hdr and l and l[0].isdigit():
|
||||
v=l.strip().strip(',').split(',')
|
||||
if len(v)>=len(hdr): rows.append(dict(zip(hdr,map(int,v[:len(hdr)]))))
|
||||
if l.startswith('---PROFILEDATA---') and rows: pass
|
||||
rows=[r for r in rows if r['Flags']==0]
|
||||
def ms(a,b): return [(r[b]-r[a])/1e6 for r in rows if r[a]>0 and r[b]>0]
|
||||
def p(x):
|
||||
x=sorted(x); return f"p50 {x[len(x)//2]:.1f} p90 {x[int(len(x)*.9)]:.1f} max {x[-1]:.1f}" if x else "-"
|
||||
print("frames",len(rows))
|
||||
print("total ", p(ms('IntendedVsync','FrameCompleted')))
|
||||
print("input+anim ", p(ms('HandleInputStart','PerformTraversalsStart')))
|
||||
print("traversal ", p(ms('PerformTraversalsStart','DrawStart')))
|
||||
print("record draw", p(ms('DrawStart','SyncQueued')))
|
||||
print("sync ", p(ms('SyncStart','IssueDrawCommandsStart')))
|
||||
print("issue cmds ", p(ms('IssueDrawCommandsStart','SwapBuffers')))
|
||||
print("swap ", p(ms('SwapBuffers','FrameCompleted')))
|
||||
if 'GpuCompleted' in hdr: print("gpu ", p(ms('IssueDrawCommandsStart','GpuCompleted')))
|
||||
Reference in New Issue
Block a user