Некоторые обычно используемые макеты для Android, такие как RelativeLayout и LinearLayout (когда веса отличны от нуля) имеют onMeasure() реализации, которые измеряют своих детей дважды, что приводит к экспоненциальному времени работы при вложенности. Это легко проверить, испустив записи журнала из листа View onMeasure()... он называется 2 ^ глубиной раз.
Может кто-нибудь дать четкое и конкретное описание, почему это так? Самое главное, это экспоненциальное поведение из-за важной части общего контракта, или это просто деталь реализации который может быть оптимизирован? Если это считается неизбежным, просьба привести пример, который требует его.
Такой пример очень помог бы мне и другим которые ворчат, что "держите свои макеты мелкие", мандат обременителен и кто задается вопросом будет ли это просто еще не оптимальные алгоритмы в основных библиотеках, или действительно ли существует фундаментальная трудность блокировка исправления.
Возможно, минимальный пример будет состоять кнопки внутри LinearLayout внутри другого LinearLayout (с match_parent и весом = 1 везде, чтобы вызвать полное экспоненциальное поведение), с некоторыми дополнительными параметрами или обстоятельствами что ясно, что все четыре вызова to Button.onMeasure() действительно значимы и необходимы.
Мое первое предположение заключалось бы в том, что только два линейных действительно необходимы обходы - первый обход, чтобы собрать все предпочтительные размеры, второй обход для распределения провисания и/или усадку. Другие двигатели компоновки в мире, такие как Tex и Swing похоже, способны регулярно обрабатывать очень глубокие иерархии имея множество ограничений выравнивания и растяжек, без какого-либо экспоненциального раздутия, и я представляю, как они работают.
Обратите внимание: мне не нужны ответы, объясняющие, как происходит экспоненциальное раздутие. Я понимаю, что, и уже было несколько должностей, где это было спросил и ответил:
- Почему вложенные веса плохо подходят для производительности? Альтернативы?
- Время измерения макета Android удваивается с каждым шагом вверх по иерархии
- Предупреждение о маске макета Плохая производительность вложенного веса
- Эффективность иерархии Android Layout
- http://android-developers.blogspot.com/2009/02/android-layout-tricks-1.html
Мой вопрос заключается в том, является ли рекурсивное двойное измерение принципиально необходимо/обосновано, и если да, то я хотел бы получить ясное объяснение/пример, показывающий, почему.
Edit 2013/8/22: Я думаю, может быть, мой вопрос все еще не проходит. Я попытаюсь прояснить и объяснить свою мотивацию, более смело на этот раз.
Макет не является экспоненциально трудной задачей, о чем свидетельствуют эффективные механизмы компоновки в мире, такие как Tex и Swing.
Итак, что случилось с LinearLayout, и как сообщество разработчиков Android будет действовать в ответ? Я прошу не в духе возложения вины, а скорее понять и решить, как лучше всего двигаться вперед.
Я могу представить 4 возможности:
- Исправить ошибку производительности в основной библиотеке, не меняя контрактов
- Измените контракты по мере необходимости и исправьте ошибку производительности в основная библиотека
- Напишите альтернативу LinearLayout, которая имеет (а именно, распределение лишнего пространства среди детей в определенных пропорциях), но без ошибки производительности и использования его для новых приложений.
- Продолжайте микроуровневать наши макеты, чтобы ошибка производительности для остальной части нашей карьеры развития Android.
(4) не является серьезным вариантом для меня лично. Кроме того, мне кажется ясным, что изменение поведения LinearLayout на данный момент нецелесообразно, поэтому я не верю (2) также является серьезным вариантом.
Это оставляет (1) и (3). Я способен и желаю сделать это лично, но какой? Очевидно, что (1) гораздо предпочтительнее, если возможно - так, возможно ли это? Кажется, это ключевой вопрос блокировки, на который нужно ответить чтобы определить, как двигаться вперед.
Я провел некоторое время в базовом коде и документ, и это не становится ясным, поэтому я задаю здесь вопрос.