所以,自2011年2月左右以来,我一直在Android上开发。我一直敏锐地意识到的一件事是,重量和重量总和的嵌套线性布局“对性能有害”和编译器(至少是这样)当你这么做时,日食就会发出警告。
然而,根据我的经验,这样做对用户体验或切换屏幕时的速度没有明显影响。作为一个实验,我创建了以下屏幕,除了一个巨大的O.T.T之外,它除了特意外。使用权重和嵌套线性布局。我使用对比色来显示所有使用的线性布局。好处是它在大屏幕和小屏幕上看起来都一样。
我在Galaxy S4,Galaxy Note 10.0,Galaxy note 3 7“和非常小的低功率Galaxy Neo上尝试过。我在姜饼,奶油三明治,Kitkat和Lollupop上尝试过它,看不到任何东西这个屏幕之间可感知的速度差异是一个简单的,相对布局上有4个按钮。
那是什么让这个坏主意?引擎盖下发生了什么使得这个解决方案不够理想?当我将drawables或图像添加到混合中时,所有这些都会改变吗?
答案 0 :(得分:5)
这里的主要问题与Android positions your views on screen的方式有关。只要某个位置相对于视图发生变化,那么" layout"通过视图层次结构传递级联,触摸每个视图并执行一些计算(类似于更改"尺寸"开始"测量"传递)。
某些布局容器(如RelativeLayout)必须强制使用第二个"布局"传球开球;一旦所有视图都计算出了他们想要的位置,ReltativeLayout就需要根据它的布局属性重新定位所有内容。
这会导致Double Layout Taxation通过视图层次结构;这不是免费的。
现在,如果您有浅层次结构,则此操作的开销无关紧要。当这个问题开始出现问题时,就是你有一个深层次结构,其中有多个双布局容器。例如,在根处有一个RelativeLayout,其中包含具有"测量最大子元素的LinearLayout"设置它。结果是叶节点视图将具有" layout"呼吁他们〜8次。
这对性能的影响与场景中布局/度量传递的复杂程度直接相关。如果没有任何问题,那么对于高端设备来说,每次观看12x的布局通行证并不是什么大问题。但是,如果其中一个叶节点具有复杂的布局通道,那么您只是浪费周期。
这里的主要主题是对有问题的事情进行分析,但请记住,以错误的方式设置只是浪费可以在其他地方使用的性能。
答案 1 :(得分:3)
那是什么让这个坏主意?
这不是一个坏主意。它也不是免费的。
特别是,尽管您提出了相反的抗议,但您的情况相当简单。虽然您的布局相当复杂,但它会渲染一次。因此,虽然您可以在渲染时丢弃几帧,但是这个价格会支付一次(或者更确切地说,每个使用此布局的活动/片段一次)。
每布局费用成为一个更大的问题,就是通过让其中几个动画放大而放大,例如ListView
/ RecyclerView
中的行或{中的页面} {1}}。现在,当用户滑动并使我们重绘内容时,我们将经历很多很多的渲染过程。列表中的每一行都可能比您的布局简单得多,但我们也会尝试每秒多次绘制。而且,虽然在您的情况下可能不会注意到几个丢帧,但在动画期间丢帧的几乎就是Android UI的“jank”定义。
只要你没有jank - IOW,你没有丢弃任何帧,正如ViewPager
在LogCat中报告的那样,或者通过开发者选项在Choreographer
叠加层中看到 - 那么你的布局很好,至少就我和大多数用户而言都是如此。相反,如果你 丢帧,试图找出更有效的布局,甚至可能是自定义gfxinfo
而不是通用的布局,可能有助于缓解这种情况。