[youtube=http://www.youtube.com/watch?v=-F_ke3rxopc]
Поклонники мобильных устройств Apple, таких как iPhone, iPod touch и iPad, часто задаются вопросом, почему прокрутка на телефонах и планшетах Android не может быть такой же плавной, как на устройствах iOS. Это было своего рода загадкой, особенно учитывая, что оригинальный iPhone достиг такой плавности более четырех лет назад на оборудовании, которое было значительно медленнее, чем мощные чипы, питающие современные суперфоны Android.
Устав от дезинформации о том, как работает рендеринг графики на Android, инженер Диана Хакборн прояснила ситуацию сегодня в Google+. Android всегда использовал некоторую аппаратную акселерацию для отрисовки, начала она. «Еще до версии 1.0 вся композиция окон на дисплей выполнялась с использованием аппаратного обеспечения», — сказала Хакборн.
Пользовательский интерфейс Apple полностью аппаратно ускорен с первого дня, могут сказать циники. По правде говоря, Apple разрабатывает аппаратное обеспечение, чипы и операционную систему, что позволяет им нацеливать iOS специально на конкретные CPU и GPU — роскошь, которой нет у Android. Не будем забывать, что Android выполняет настоящую многозадачность и фоновые процессы, в отличие от iOS, что добавляет накладных расходов. Также добавляет накладных расходов: нативные приложения iOS — это бинарные файлы, предварительно скомпилированные для их собственного оборудования, в то время как Android использует виртуальную машину Dalvik с JIT-компиляцией для запуска Dalvik dex-кода (Dalvik Executable), который обычно транслируется из байт-кода Java.
Честно говоря, Google следует отдать должное за то, что они рассматривают каждое обновление платформы как возможность усовершенствовать функции аппаратного ускорения. Например, они только что включили более плавную графику во всех приложениях Ice Cream Sandwich, использующих новые API.
Если вы задавались вопросом: отображение меню, выдвигание панели уведомлений, переходы между действиями, появление и исчезновение всплывающих окон и диалогов – Android перекладывает все эти «прибамбасы» на GPU. Скорость GPU и пропускная способность шины памяти напрямую влияют на плавность интерфейса, объяснила Хакборн:
По мере увеличения разрешения экрана устройства достижение пользовательского интерфейса с частотой 60 кадров в секунду тесно связано со скоростью GPU и, особенно, с пропускной способностью шины памяти GPU. На самом деле, если вы хотите получить представление о производительности аппаратного обеспечения, всегда обращайте пристальное внимание на пропускную способность шины памяти. Бывает много случаев, когда CPU (особенно с этими замечательными инструкциями NEON) может работать намного быстрее, чем шина памяти.
Но GPU «не является волшебной панацеей для идеально плавного пользовательского интерфейса», утверждает она. Новый смартфон Galaxy Nexus (9to5Google скоро опубликует на него обзор) использует ряд приемов для достижения плавной прокрутки списков, веб-страниц и другого контента в приложениях, включая отключение аппаратного ускорения OpenGL в тех частях интерфейса, которые в противном случае стоили бы 8 МБ оперативной памяти и отвлекали бы ресурсы от других задач, таких как фоновые процессы и многозадачность. При условии, что CPU телефона достаточно быстр, он может отрисовывать графику без накладных расходов GPU. А в случае с Nexus S:
Nexus S без проблем обеспечивает рендеринг со скоростью 60 кадров в секунду для всех обычных элементов пользовательского интерфейса Android, таких как прокрутка списков на его экране 800×480. Однако оригинальный Droid испытывал трудности с аналогичным разрешением экрана.
Подводя итог, аппаратное ускорение не является абсолютным решением для плавного пользовательского интерфейса просто потому, что возможности GPU смартфона ограничены. Например, GPU Nvidia Tegra 2, который встречается в некоторых смартфонах Android, может обрабатывать каждый пиксель экрана 1280 на 800 примерно 2,5 раза при 60 кадрах в секунду, оставляя мало места для сложных, многослойных анимаций:
Теперь рассмотрим домашний экран планшета Android 3.0, когда вы переключаетесь на список всех приложений: вам нужно отрисовать фон (1x все пиксели), затем слой ярлыков и виджетов (давайте будем снисходительны и скажем, что это 0.5x все пиксели), затем черный фон всех приложений (1x все пиксели), и иконки и метки всех приложений (0.5x все пиксели). Мы уже превысили наш пиксельный бюджет, и мы еще даже не скомпоновали отдельные окна на конечном дисплее. Для получения анимации 60 кадров в секунду Android 3.0 и более поздние версии используют ряд приемов. Один из основных заключается в том, что он пытается поместить все окна в оверлеи вместо того, чтобы копировать их в фреймбуфер с помощью GPU. В данном случае даже с этим мы все еще превышаем бюджет, но у нас есть еще один трюк: поскольку обои на Android находятся в отдельном окне, мы можем сделать это окно больше экрана, чтобы оно вмещало всю растровую карту. Теперь, при прокрутке, перемещение фона не требует никакой отрисовки, только перемещения его окна… и поскольку это окно находится в оверлее, его даже не нужно компоновать на экране с помощью GPU.