Ответ
Частые вызовы GC в onDraw() приводят к пропускам кадров (jank), т.к. сборка мусора требует приостановки UI-потока.
Причины:
- Создание временных объектов (например,
new Paint(),new Rect()) в циклеonDraw() - Автоупаковка примитивов (например,
Integer.valueOf())
Решение:
- Выносите создание объектов в инициализацию (поля класса)
- Используйте
canvas.save()/restore()вместо создания новых матриц - Для сложных вычислений - кешируйте результаты
// Плохо:
override fun onDraw(canvas: Canvas) {
val paint = Paint() // Создается каждый кадр
canvas.drawText("Hello", 0f, 0f, paint)
}
// Хорошо:
private val paint = Paint() // Инициализируется один раз
override fun onDraw(canvas: Canvas) {
canvas.drawText("Hello", 0f, 0f, paint)
}