2015-05-13 50 views
0

因此,自2011年2月左右开始,我一直在开发Android系统。我一直非常清楚的一件事情是,嵌套线性布局的重量和重量总和对性能不利,而且编译器(至少是eclipse如果你有这样的话,这是一个警告。嵌套重量的线性布局,为什么认为不好?

但是,我的经验是,这样做对用户体验或切换屏幕时的速度没有明显影响。作为一个实验,我创建了以下屏幕,其故意除了大型O.T.T之外没有任何其他功能。使用权重和嵌套线性布局。我用对比色来显示所有使用的线性布局。好处是它在大屏幕和小屏幕上看起来都一样。

Mega Nested Linear Layout with Weights

我已经尝试过在银河S4,Galaxy Note的10.0,Galaxy Note的3 7" ,和非常小的低功率银河新。我已经试过它姜饼,冰淇淋三明治,奇巧和Lollupop并没有看到这个屏幕之间有任何可察觉的速度差异,在相对布局上有一个简单的4个按钮。

那么是什么让这个如此糟糕的主意?引擎盖下发生了什么,想法解决方案吗?当我添加绘图或图像到混合中时,所有这些都会改变吗?

回答

3

那么是什么让这样一个坏主意?

这不是一个坏主意。它也不是免费的。

尤其是,尽管您有相反的抗议,但您的方案相当简单。虽然您的布局相当复杂,但它只会呈现一次。因此,虽然在渲染时可能会丢失几帧,但该价格只支付一次(或者更确切地说,每个活动/使用此布局的片段一次)。

其中每个版面费成为一个更大的问题是,当它是由有几个人是避开动画,放大如在ListView/RecyclerView行,或在ViewPager页面。现在,我们正在通过许多和的渲染通行证,因为用户滑动并导致我们重新绘制内容。列表中的每一行都可能比布局简单得多,但我们也会试图每​​秒绘制很多次。而且,虽然在您的情况下可能不会注意到几帧丢失帧,但在动画过程中丢失的帧几乎就是Android UI的“jank”定义。

只要你有没有JANK - 督察,你不会放弃任何帧,作为logcat的报告Choreographer或通过开发人员选项在gfxinfo覆盖看到 - 那么你的布局是好的,至少就因为我和大多数用户都很关心。相反,如果你丢帧,试图找出更有效的布局,甚至可能定制ViewGroups而不是通用的,可能有助于缓解这种情况。

5

这里的主要问题与如何Android positions your views on screen有关。任何时候某个职位相对于某个视图发生变化时,“布局”会通过视图层级传递级联,触摸每个视图并执行一些计算(类似于更改“大小”会踢出“度量”关卡)。

某些布局容器(如RelativeLayout)必须强制执行第二个“布局”传递;一旦所有的视图都计算出了他们想要的位置,ReltativeLayout需要根据它的布局属性重新定位所有的东西。

这会导致Double Layout Taxation通过视图层次结构;这不是免费的。

现在,如果你有一个层次,这一行动的开销是微不足道的。在开始遇到问题的地方是当你有一个深层次的层次结构时,其中有多个双布局容器。例如,在根上有一个RelativeLayout,其中包含LinearLayouts,其上设置了“最大子度量”。其结果是叶节点视图将对它们调用“布局”〜8倍。

这对性能的影响直接关系到您的布局/度量值在场景中的复杂程度。如果什么都没有问题,那么对于高端设备来说,一次12倍的视图布局通行证并不是什么大问题。但是,如果其中一个叶节点具有复杂的布局通过,那么你就是在浪费周期。

这里的主要话题是描述出现问题的事物,但请记住,以错误的方式设置事件只是浪费可能在其他地方使用的性能。

+2

哇科尔特,这是多么的荣幸。看起来我有一些阅读要做。 –