最近在看图形显示方面的内容,这块的知识点繁多且复杂,到了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架构?
- 数值设置的依据是?是一个动态的数值吗?不同的数值会有什么影响?会影响跟手性吗?