Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 屏幕帧渲染完成/显示回调_Ios_Objective C_Swift_Macos_Quartz Core - Fatal编程技术网

Ios 屏幕帧渲染完成/显示回调

Ios 屏幕帧渲染完成/显示回调,ios,objective-c,swift,macos,quartz-core,Ios,Objective C,Swift,Macos,Quartz Core,我想知道屏幕帧完成渲染并显示的确切时间,这样我就可以用quartz api捕捉特定的窗口图像。有CVDisplayLink/CADisplayLink,允许应用程序将其绘图与显示器的刷新率同步 据我所知,这些方法与我所需要的非常相似,但在需要渲染屏幕帧时调用,而不是在完成并呈现屏幕帧时调用,这意味着如果我当时捕获当前屏幕图像,我只能看到之前的渲染。这是正确的想法吗 如果是,是否有办法在帧实际完成渲染并呈现时获得通知?也许有专门的api?理想情况下,我需要一个macOS的答案,但如果你碰巧知道如何

我想知道屏幕帧完成渲染并显示的确切时间,这样我就可以用quartz api捕捉特定的窗口图像。有
CVDisplayLink
/
CADisplayLink
,允许应用程序将其绘图与显示器的刷新率同步

据我所知,这些方法与我所需要的非常相似,但在需要渲染屏幕帧时调用,而不是在完成并呈现屏幕帧时调用,这意味着如果我当时捕获当前屏幕图像,我只能看到之前的渲染。这是正确的想法吗

如果是,是否有办法在帧实际完成渲染并呈现时获得通知?也许有专门的api?理想情况下,我需要一个macOS的答案,但如果你碰巧知道如何在iOS中做到这一点,请告诉我


另外,我知道
CGDisplayStream
,它是捕获整个屏幕而不是特定窗口的一个很好的解决方案–它使用运行循环和调度队列,这意味着回调不会像显示链接那样实时调用。

对视图和重写方法进行子类化如何。根据文档
,调用此方法时,UIKit已正确配置绘图环境
。因此,在这个方法中生成的事件将位于默认显示序列的末尾。我需要捕获刚刚绘制到屏幕上的内容,而不是绘制。无法保证自定义视图将是绘制队列中的最后一项,即使是,此时也不太可能显示绘制的帧,除非它直接绘制到屏幕上。另外,捕获的窗口可能属于其他应用程序。我不明白为什么
CGDisplayStream
不是您想要的。它提供了一种在屏幕更新时捕获屏幕每一帧的方法。当整个帧缓冲区传递给您时,回调是否实时发生没有区别。如果您想将焦点缩小到单个窗口,则可以使用NSScreen中的支持转换功能。为什么这不是你想要的?是的,就像我说的,我需要捕捉特定的窗口,而不是整个屏幕。捕获的窗口可以是透明的,形状不规则,有圆角——在透明区域下捕获的所有东西都需要分开,这是一项艰巨的任务。因此,从显示流数据中提取单个窗口不是一个解决方案。备份转换不是问题,但如果在捕获过程中移动/调整窗口大小,则备份转换将毫无用处,因为正是时间因素-3/4情况下的窗口帧将与渲染的窗口帧不同。这就是我目前所得到的,并试图避免的。