在`ListView`中,为什么禁用`animationCache`和`scrollingCache`会减少滚动延迟?

时间:2015-02-26 06:50:11

标签: android performance

我试图获取有关文档中方法的更多信息,但我找不到与我的问题相关的任何有用信息。

启用缓存会引入滞后似乎违反直觉 - 缓存的目的毕竟是减少检索延迟。那么这些方法究竟发生了什么呢?

1 个答案:

答案 0 :(得分:1)

滚动缓存基本上是一个绘图缓存。

在android中,您可以要求View将其绘图存储在名为绘图缓存的缓存中(基本上是位图)。默认情况下,禁用绘图缓存,因为它会占用内存,但您可以通过setDrawingCacheEnabled或通过硬件层(setLayerType)明确要求View创建一个。

那为什么它有用呢?因为与每帧重绘视图相比,使用绘图缓存可以使动画更流畅。

这种类型的动画也可以是硬件加速的,因为渲染系统可以采用这个位图并将其作为纹理上传到GPU(如果使用硬件层)并对其进行快速矩阵操作(如更改alpha,平移,旋转)。将其与动画进行比较,你是在每一帧上重绘(onDraw被调用)。

对于列表视图,当您通过投掷滚动时,您实际上是为列表的视图设置动画(向上或向下移动它们)。列表视图使用其可见子项的绘图缓存(以及边缘附近的一些可能可见的子项)来非常快速地为它们设置动画。

使用绘图缓存是否有缺点?是的,它消耗内存,这就是默认情况下它在视图中关闭的原因。对于ListView,只要您触摸ListView并稍微移动(以区分点按滚动),就会自动为您创建缓存。换句话说,只要ListView认为您要滚动/滚动它就会创建一个滚动缓存,让您为滚动/拖动动画设置动画。

同样,AnimationCache有时可能是邪恶的(邪恶我的意思是它会增加GC的频率)

定义布局动画是否应为其子项创建绘图缓存。启用动画缓存会占用更多内存,并且需要更长的初始化但提供更好的性能。默认情况下启用动画缓存。

以下是我们对列表视图所做的操作。首先,这是原始列​​表视图。

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="@color/list_background_color"
    android:dividerHeight="0dp"
    android:listSelector="#00000000"
    android:smoothScrollbar="true" />

这是改变之后的那个

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="@color/list_background_color"
    android:dividerHeight="0dp"
    android:listSelector="#00000000"
    android:smoothScrollbar="true"
    android:scrollingCache="false"
    android:animationCache="false" />

您可以访问此链接

  

http://queriesofandroid.blogspot.in/2015/03/in-listview-why-does-disabling.html