lixplor / android-Q-A

🐞 android related questions and answers
0 stars 0 forks source link

SurfaceView绘制时闪烁 #82

Closed lixplor closed 7 years ago

lixplor commented 7 years ago

SurfaceView在绘制时, 之前绘制的内容会闪烁

lixplor commented 7 years ago

SurfaceView内部有2个或3个缓冲区, 每次调用surfaceHolder.lockCanvas()时, 获取缓冲区的Canvas对象, 绘制后调用surfaceHolder.unlockCanvasAndPost(canvas)将数据写入缓冲区, 同时会更换为下一个缓冲区显示, 所以每次绘制的内容是分别存在于不同缓冲区的. 如果绘制较慢(比如每次都绘制整个画布), 则由于单次绘制时间较长, 则会显示出缓冲区交替的闪烁.

解决方法:

  1. 在绘制时, 只绘制要更新的区域. 使用surfaceHolder.lockCanvas(dirtyRect), 计算出要绘制的区域的矩形, 每次只更新这个区域, 可以提升绘制速度, 速度快则看不出闪烁
  2. 在绘制时, 每次循环绘制2-3次, 即将所有缓冲区都画一遍 缺点是耗时长, 导致卡顿