Ответ
Для выявления задержек рендеринга используйте Choreographer и FrameMetrics:
- Choreographer:
Choreographer.getInstance().postFrameCallback(object : Choreographer.FrameCallback {
override fun doFrame(frameTimeNanos: Long) {
val frameTimeMs = frameTimeNanos / 1_000_000
val currentTime = SystemClock.uptimeMillis()
val delay = currentTime - frameTimeMs
if (delay > 16) { // >16ms = пропущен кадр (60fps)
Log.w("FrameDelay", "Frame delayed by $delay ms")
}
Choreographer.getInstance().postFrameCallback(this)
}
})
- FrameMetrics (API 24+):
window.addOnFrameMetricsAvailableListener({ _, frameMetrics, _ ->
val totalDuration = frameMetrics.getMetric(FrameMetrics.TOTAL_DURATION)
if (totalDuration > 16_000_000) { // наносекунды
Log.w("FrameMetrics", "Slow frame: ${totalDuration / 1_000_000}ms")
}
}, Handler())
Дополнительно:
- Включите GPU Rendering Profile в настройках разработчика
- Используйте Systrace для детального анализа
- Проверяйте onDraw на тяжелые операции
- Избегайте вложенных ViewGroups и сложных layout-иерархий