我需要帮助才能更好地理解行为方式CADisplayLink和drawRect行为,以便我能够弄清楚如何将应用程序的帧速率保持在平滑的60fps.到目前为止,我(可能是不正确的)理解如下:
1)CADisplayLink当显示刷新时调用指定的选择器(所谓的"v-sync"事件;大约每16ms).
2)iOS使用双缓冲,这意味着当显示一个帧缓冲区时,我们可以准备(绘制)另一个,并在下一个v-sync事件中交换两个.
3)因此,从显示链接触发时起,我有大约16ms的时间来确保完成下一帧所需的所有计算和绘图,以便在交换缓冲区和屏幕刷新时一切准备就绪.
4)自定义UIView的drawRect方法绘制到后台缓冲区,因此在drawRect调用方法后,在下一个v-sync事件中显示任何自定义绘图.
这是真的有效吗?(如果下一个v-sync事件发生在我完成绘制到后台缓冲区之前会发生什么?)
然后,我应该如何使用CADisplayLink重绘自定义UIViews?我试图setNeedsDisplay在显示链接触发时调用,但是在drawRect方法实际开始之前有一个延迟:
2014-12-10 19:17:21.000 myApp[39487:60b] Display link fired.
2014-12-10 19:17:21.001 myApp[39487:60b] Sending setNeedsDisplay
2014-12-10 19:17:21.012 myApp[39487:60b] drawRect beginning
2014-12-10 19:17:21.013 myApp[39487:60b] drawRect finished
2014-12-10 19:17:21.017 myApp[39487:60b] Display link fired.
2014-12-10 19:17:21.018 myApp[39487:60b] Sending setNeedsDisplay
2014-12-10 19:17:21.029 myApp[39487:60b] drawRect beginning
2014-12-10 19:17:21.031 myApp[39487:60b] drawRect finished
2014-12-10 19:17:21.033 myApp[39487:60b] Display link fired.
Run Code Online (Sandbox Code Playgroud)
这是一个非常简化的示例,在该drawRect方法中几乎没有绘图.我的一些更复杂的drawRect可能需要10毫秒才能完成.但是drawRect开始和下一次显示刷新之间只有5ms !另外,在显示链接触发和drawRect开始之间显然有"浪费"了整整一毫秒!我该如何利用那段时间?
如果我尝试drawRect直接在显示链接选择器中调用,我得到这样的东西:
2014-12-10 19:24:41.000 myApp[39495:60b] Display …Run Code Online (Sandbox Code Playgroud) 我最近在 Git 存储库中包含的二进制文件中发现了一个单位错误:
\n$ diff <(xxd old-clone/file) <(xxd new-clone/file)\n< 00251230: 0412 c2bd 2e61 efeb 21b4 d904 3388 2539\n---\n> 00251230: 0412 c0bd 2e61 efeb 21b4 d904 3388 2539\nRun Code Online (Sandbox Code Playgroud)\n令人担忧的是,git 没有发现任何问题。我之所以发现这个问题,是因为我们的一项测试神秘地开始失败,并且没有任何提交的更改。
\n当我从服务器对存储库进行新克隆时,测试再次通过。我现在遇到的情况是,我有两个存储库副本,两者都在同一提交中签出,并且都报告了一个干净的工作树,但该文件的版本明显不同:
\n$ cd old-clone && git status && cd ..\nHEAD detached at 251265a4\nnothing to commit, working tree clean\n$ cd new-clone && git status && cd ..\nHEAD detached at 251265a4\nnothing to commit, working tree clean\n$ diff old-clone/file new-clone/file\nBinary files old-clone/file and new-clone/file differ\nRun Code Online (Sandbox Code Playgroud)\n我已确认:
\n …