我试图弄清楚vsync如何在iOS上运行,并与CADisplayLink
结合使用。我想在这里回答的问题是:
我设置了一些测试:
CADisplayLink
计时器
[CADisplayLink timestamp]
和mach_absolute_time()
测试1:基础测试:在这里,我只跟踪了10000个样本:
timestamp-----
max: 16.762583
min: 16.627625
mean: 16.675080
variance: 0.000333
mach----------
max: 22.606042
min: 10.815958
mean: 16.675694
variance: 0.602793
diff----------
max: 5.941417
min: 0.000750
mean: -0.000615
variance: 0.607476
测试2:由于CPU等待时间短而导致帧丢失:这里,在帧X上,我只是坐在自旋锁中进行Y次迭代。记录相对于第X帧的帧时间:
Y = 200000
-1: 16.72 17.85 (-1.13)
0: 16.66 15.37 (1.29)
1: 33.32 43.74 (-10.42) (*)
2: 16.74 4.34 (12.40) (*)
3: 16.61 16.70 (-0.10)
4: 16.71 16.65 (0.06)
Y = 100000
-1: 16.66 16.50 (0.16)
0: 16.69 16.67 (0.02)
1: 16.63 22.21 (-5.58) (*)
2: 16.68 9.91 (6.77) (*)
3: 16.70 16.04 (0.67)
4: 16.69 16.70 (-0.01)
测试3:与测试2相同,但使用OS调用睡眠t秒
t = 0.03
-1: 16.67 16.54 (0.14)
0: 16.68 16.91 (-0.23)
1: 33.35 34.78 (-1.43) (*)
2: 16.68 14.93 (1.74) (*)
3: 16.68 16.87 (-0.20)
4: 16.67 16.48 (0.19)
t = 0.02
-1: 16.64 16.54 (0.09)
0: 16.72 16.91 (-0.19)
1: 16.66 20.79 (-4.13) (*)
2: 16.69 12.60 (4.08) (*)
3: 16.67 18.24 (-1.57)
4: 16.68 15.09 (1.59)
t = 3.0
-1: 16.68 16.74 (-0.07)
0: 16.63 16.58 (0.05)
1: 266.84 3004.04 (-2737.20) (*)
2: 2751.35 14.82 (2736.54) (*)
3: 16.66 16.80 (-0.14)
4: 16.68 15.86 (0.81)
观察:
CADisplayLink
NOT 在CPU帧丢失时等待vsync。[CADisplayLink timestamp]
CADisplayLink
调用仅在图形驱动程序的命令缓冲区为空,或GPU的命令缓冲区为空(因此从图形驱动程序请求更多命令或取消阻止)时发生)。CADisplayLink
就会停止被调用。CADisplayLink
调用。CADisplayLink
CADisplayLink
- 一个 管道的下游结果等待远端的vsync。[CADisplayLink timestamp]
与"实际"不同的原因。时间,mach_absolute_time()
。例如,测试2:i = 100000 :
因此,对于用户来说,没有丢帧。
我离这里有多远?我希望自己是一名计算机工程师。