返回

Android View双缓冲绘制下不符合逻辑的刷新机制解读

Android

前言

在Android开发中,View的刷新机制是十分重要的,它决定了UI界面的流畅性。在Android 3.0版本之前,View的刷新机制是单缓冲的,即在屏幕上显示的像素数据与内存中的像素数据是同一个缓冲区,当View发生变化时,需要先将内存中的像素数据拷贝到屏幕上,然后再将新的像素数据写入内存。这种单缓冲机制的缺点是,当View发生变化时,屏幕上会看到闪烁的情况。

双缓冲机制

为了解决单缓冲机制的闪烁问题,Android 3.0版本引入了双缓冲机制。双缓冲机制是指在内存中维护两个缓冲区,一个前缓冲区和一个后缓冲区。当View发生变化时,新的像素数据会先写入后缓冲区,然后再将后缓冲区的内容拷贝到前缓冲区。前缓冲区的内容会被显示到屏幕上,而不会看到闪烁。

不符合逻辑的刷新机制

双缓冲机制虽然解决了闪烁的问题,但是它也引入了一个新的问题,即不符合逻辑的刷新机制。所谓不符合逻辑的刷新机制,是指当View发生变化时,新的像素数据并不会立即显示在屏幕上,而是需要等到下一次VSYNC信号到来时才会显示。VSYNC信号是一个硬件信号,它告诉GPU可以开始新的一帧渲染了。在60Hz的刷新率下,VSYNC信号每秒会发出60次。这意味着,当View发生变化时,新的像素数据最多需要等待16毫秒才会显示在屏幕上。

不符合逻辑的刷新机制的根源

不符合逻辑的刷新机制的根源在于SurfaceFlinger。SurfaceFlinger是一个系统服务,它负责将应用程序的像素数据合成到屏幕上。SurfaceFlinger是一个单线程服务,这意味着它一次只能处理一个应用程序的像素数据。当多个应用程序同时发生变化时,SurfaceFlinger需要按照一定的顺序来处理这些应用程序的像素数据。这种顺序是由WindowManager决定的。WindowManager是一个系统服务,它负责管理应用程序的窗口。WindowManager会将应用程序的窗口按照一定的顺序排列,然后将这个顺序传递给SurfaceFlinger。SurfaceFlinger会按照这个顺序来处理应用程序的像素数据。

优化刷新机制

为了优化刷新机制,我们可以做以下几件事:

  • 尽量减少View发生变化的次数。
  • 尽量避免在动画过程中更新UI。
  • 使用硬件加速。
  • 使用双缓冲机制。

结语

双缓冲机制是一个非常重要的技术,它可以解决单缓冲机制的闪烁问题。但是,双缓冲机制也引入了一个新的问题,即不符合逻辑的刷新机制。这种不符合逻辑的刷新机制的根源在于SurfaceFlinger。为了优化刷新机制,我们可以做以下几件事:尽量减少View发生变化的次数,尽量避免在动画过程中更新UI,使用硬件加速,使用双缓冲机制。