愿历尽千帆 归来仍少年

Android|图形栈疑问汇总(持续更新)

字数统计: 1,742阅读时长: 6 min
2022/09/06

最近在看图形显示方面的内容,这块的知识点繁多且复杂,到了S以及T上有了较多的变化,单看理论源码的话,难以形成深刻的认知。
所以打算在最近的学习过程中列举出自己的一些疑问,后面会持续的更新疑问并补充个人的理解。

1. onMeasure/ onLayout/ onDraw 分别做得事?

2. 如何理解Window/ ViewRootImpl/ Surface/ SurfaceTexture/ TextureView/ GLSurfaceview 概念及其相互的关系?

3. 如何理解硬件加速这一角色?

  • 硬件加速引入的初衷?
  • 会带来什么样的好处及对内存的影响?
  • 如何强制让View/ Window/ Activity 开启硬件加速?
  • 如何快速判断是否开了硬件加速?
  • 什么情况下会依旧采用软件绘制?
  • 如果是软件绘制的话,大概过程是怎么样的?
  • 如果是硬件加速的话,大概过程是怎么样的?

4. RenderThread 扮演的角色?

  • 为何要另起个线程?
  • queueBuffer 结束是否标志GPU 完成?
  • RenderThread是如何和MainThread 交互的?
  • RenderThread是如何和Sf 交互的?

5. 游戏的绘制和普通App 应用有什么区别?

  • 游戏的绘制阶段buffer 是自身控制还是受系统buffer count限制?
  • 游戏会听Vsync吗?如果不受Vsync 控制,那么游戏绘制的节奏是如何把握的?

6. Choreographer#doframe 扮演的角色?

  • 触发的时机?

7. 如何理解掉帧这个概念?

  • 市面统计掉帧工具如PerfDog 等测试原理?
  • 如何根据Perfetto 快速统计出实际FPS?
  • 为何掉帧要看Sf 而不是App 侧?
  • 如果一帧在绘制阶段超出了一个Vsync,但是此时有其它layer 更新的buffer,此时Sf 拿到了并正常合成,那么这次究竟算不算掉帧?视觉上会不会感受到卡顿?

8. 为何Google 声称三缓冲能够有效降低掉帧?

  • 如果是这样的话,那多增加一些buffer count 不是会更流畅?为何没有这么做?
  • 对于常见的三级流水线而言,Triple buffer 会比double buffer 触控延时更好?
  • 试想一下,如果在三级流水线上,分别有绘制稳定、绘制过快、绘制过慢这三种场景下,Triple buffer和double buffer 一帧从绘制到显示的延迟周期差异?

9. 如何理解client 和device 合成?

  • 发起GPU 合成动作是在哪个线程中?
  • device 合成是在哪里完成的?涉及到什么硬件?
  • 如何判断本次合成是GPU合成还是硬件合成?

10. 什么情况下layer 会采用GPU 合成?

  • 举个例子,比如为何处于桌面静止下dump 出来显示是GPU 合成?

11. 如何理解画面撕裂这个现象?

  • 什么情况下可能会出现画面撕裂?
  • 如果出现了画面撕裂,有哪些分析排查的思路?

12. Vsync offset 引入的目的是?

  • 其数值不同会有什么影响?
  • 厂商一般是如何调校SF以及App的offset 数值的?
  • 调整Sf offset后 对触控延时可能的影响?
  • offset 数值的改变对游戏应用有影响吗?
  • 举个例子,对于60fps而言,如何调整Sf offset 数值并且要满足什么样的条件,会对触控延时有改善即能够省掉一个Vsync 周期时间?

13. 图形系统中不同进程是如何操作同一块buffer的?

14. 一个Vsync 周期内,绘制和合成用的是同一块buf 吗?

  • 举个例子,在offset为0的情况下,一个Vsync周期内绘制和Sf的合成用的是同一个buffer吗?
  • 对于三级流水线而言,一帧最快要等几个Vsync周期才能显示?

15. 如何快速找到同一块buffer 在绘制、合成、显示的位置? (Perfetto)

  • 我们看perfetto 时,经常需要找到一块buffer 对应到App、Sf、HWC、presentFence的位置,这样可以分析waiting for GPU completion和waiting for HWC release 耗时长问题,该如何快速找到比如合成或显示用到的buffer 对应到绘制片段是哪一块?

16. 不同级数的流水线所带来的影响?

  • 不同刷新率对应的流水线级数差异?比如高刷120hz下流水线级数?
  • 如果将三级流水线改为两级或者四级会有什么影响?触控延时会降低吗?
  • 不同级数对应的buffer数目要求?

17. 如何快速厘清dequeue buffer 以及queue buffer 耗时长问题?

18. 图形显示引入Fence 机制的根本缘由是?(宏观角度概述)

  • Fence是如何跨进程跨硬件的?

19. Sf 侧的waiting for presentFence 结束点代表的含义?

20. SurfaceFlinger 是如何和HWC Service交互的?

21. 怎么理解Hwcomposer 扮演的角色?

  • 为什么不放在Sf 主线程中做?这样似乎可以省去很多的binder交互开销?

22. HWC 侧的OverlayEngin扮演的角色是?

23. HWC 下到kernel 的过程?

24. 如何排查Resync问题?

  • 哪些场景可能会触发Resync?

25. 如何排查应用自身不出帧的原因?(Perfetto)

26. Sf 默认是跑在什么大核还是小核,什么进程组?

  • 如果想让其有机会进大核,如何修改?
  • 如果想在loading轻的时候让其有机会跑大核,最安全的改法?

27. 如何排查Sf 挤压问题?

  • 一般如何排查以及优化策略?这种情况下还会对齐Vsync-sf吗?

28. 如何Sf 侧有空白或pending 现象?

29. 哪种合成会走Drawlayers?

30. 如何排查Drawlayers 耗时长?和GPU有关系吗?

31. acquireFence以及releaseFence之间的关系?

32. acquireFence放的慢或releaseFence放的慢分别意味着什么?

33. 什么情况会出现waiting for HWC release Tag 或waiting for GPU completion?

34. 如果快速排查waiting for GPU completion 耗时长问题?

  • 如何快速排查是GPU问题还是releaseFence放的慢了?
  • 如果是releaseFence放慢了影响到下一帧的合成,那么Systrace侧如何看waiting for GPU completion耗时中GPU空等时长?

34. 如Sf 未及时拿走buf 合成,可能是什么原因?

  • Sf bufferTX中有buffer进来,Sf在接到Vsync-sf没有去拿buffer合成,一般是什么原因导致?

35. 如何从Systrace侧看是否存在buffer 轮转压力?

  • 当出现buffer轮转压力时,为何waiting for HWC release 后往往会伴随着waiting for GPU completion
  • 如果waiting for GPU completion在waiting for HWC release之前出现,意味着什么?

37. buffer count数量由什么因素决定?(Android S及以上)

38. 如何知道一段时间内buffer count(Android S及以上)?

39. 如何理解BBQ机制?(Android S及以上)

40. 如何理解S上的Duration架构?

  • 数值设置的依据是?是一个动态的数值吗?不同的数值会有什么影响?会影响跟手性吗?

41. 如何理解S上的 Latch signaled buffer?

42. 如何理解S上的Sf Backpressure?

CATALOG
  1. 1. 1. onMeasure/ onLayout/ onDraw 分别做得事?
  2. 2. 2. 如何理解Window/ ViewRootImpl/ Surface/ SurfaceTexture/ TextureView/ GLSurfaceview 概念及其相互的关系?
  3. 3. 3. 如何理解硬件加速这一角色?
  4. 4. 4. RenderThread 扮演的角色?
  5. 5. 5. 游戏的绘制和普通App 应用有什么区别?
  6. 6. 6. Choreographer#doframe 扮演的角色?
  7. 7. 7. 如何理解掉帧这个概念?
  8. 8. 8. 为何Google 声称三缓冲能够有效降低掉帧?
  9. 9. 9. 如何理解client 和device 合成?
  10. 10. 10. 什么情况下layer 会采用GPU 合成?
  11. 11. 11. 如何理解画面撕裂这个现象?
  12. 12. 12. Vsync offset 引入的目的是?
  13. 13. 13. 图形系统中不同进程是如何操作同一块buffer的?
  14. 14. 14. 一个Vsync 周期内,绘制和合成用的是同一块buf 吗?
  15. 15. 15. 如何快速找到同一块buffer 在绘制、合成、显示的位置? (Perfetto)
  16. 16. 16. 不同级数的流水线所带来的影响?
  17. 17. 17. 如何快速厘清dequeue buffer 以及queue buffer 耗时长问题?
  18. 18. 18. 图形显示引入Fence 机制的根本缘由是?(宏观角度概述)
  19. 19. 19. Sf 侧的waiting for presentFence 结束点代表的含义?
  20. 20. 20. SurfaceFlinger 是如何和HWC Service交互的?
  21. 21. 21. 怎么理解Hwcomposer 扮演的角色?
  22. 22. 22. HWC 侧的OverlayEngin扮演的角色是?
  23. 23. 23. HWC 下到kernel 的过程?
  24. 24. 24. 如何排查Resync问题?
  25. 25. 25. 如何排查应用自身不出帧的原因?(Perfetto)
  26. 26. 26. Sf 默认是跑在什么大核还是小核,什么进程组?
  27. 27. 27. 如何排查Sf 挤压问题?
  28. 28. 28. 如何Sf 侧有空白或pending 现象?
  29. 29. 29. 哪种合成会走Drawlayers?
  30. 30. 30. 如何排查Drawlayers 耗时长?和GPU有关系吗?
  31. 31. 31. acquireFence以及releaseFence之间的关系?
  32. 32. 32. acquireFence放的慢或releaseFence放的慢分别意味着什么?
  33. 33. 33. 什么情况会出现waiting for HWC release Tag 或waiting for GPU completion?
  34. 34. 34. 如果快速排查waiting for GPU completion 耗时长问题?
  35. 35. 34. 如Sf 未及时拿走buf 合成,可能是什么原因?
  36. 36. 35. 如何从Systrace侧看是否存在buffer 轮转压力?
  37. 37. 37. buffer count数量由什么因素决定?(Android S及以上)
  38. 38. 38. 如何知道一段时间内buffer count(Android S及以上)?
  39. 39. 39. 如何理解BBQ机制?(Android S及以上)
  40. 40. 40. 如何理解S上的Duration架构?
  41. 41. 41. 如何理解S上的 Latch signaled buffer?
  42. 42. 42. 如何理解S上的Sf Backpressure?