Google изменила подсистему MessageQueue в Android 17 для борьбы с лагами в приложениях при отрисовке интерфейса
Google сообщила в блоге для разработчиков, что в Android 17 внесли значительные изменения, связанные с подсистемой MessageQueue. Они позволят преодолеть проблему лагов при при отрисовке интерфейса в приложениях.
В более ранних версиях Android потоки кода могли перебивать очередь, в которой отрисовываются элементы интерфейса, и вследствие этого важные процессы не могли завершиться вовремя. Это приводило к потере кадров и заметным торможениям.
Google внедрила новый механизм DeliQueue, который позволяет потокам кода работать параллельно и ограничивать лишь конкретные участки памяти. В итоге элементы интерфейса больше не будут зависать, а будут отрисовываться «по графику».
DeliQueue разделяет вставку сообщений и их обработку на список сообщений (стек Treiber без блокировок), приоритетную очередь (минимальная куча, сообщения для обработки, принадлежащие исключительно потоку Looper), а также добавляет постановку в очередь путём добавления в стек Treiber. Список сообщений хранится в стеке без блокировок, который использует цикл CAS для обновления указателя на начало списка.
Чтобы найти следующее сообщение для обработки, Looper выбирает новые сообщения из стека Treiber, обходя его с вершины до тех пор, пока не найдет последнее сообщение, которое он обработал ранее. По мере того, как Looper перемещается вниз по стеку, он вставляет сообщения в минимальную кучу, упорядоченную по времени выполнения.
Исходный код основан на Java Concurrency in Practice и доступен онлайн.
В итоге в тестах многопоточная вставка в загруженные очереди происходит до 5000 раз быстрее, чем в устаревшем MessageQueue. В трассировках Perfetto, полученных от внутренних бета-тестеров, компания заявила о сокращении времени, затрачиваемом основным потоком приложения на
Читать на habr.com