Ios drawViewHierarchyInRect与renderInContext的预期性能是什么

Ios drawViewHierarchyInRect与renderInContext的预期性能是什么,ios,objective-c,uiimage,screenshot,Ios,Objective C,Uiimage,Screenshot,在浏览了所有相关问题之后,我了解到drawViewHierarchyInRect应该比renderInContext快得多,但这不是我看到的 以下是我的快照功能和时间分析: - (UIImage *)screenshot { UIScreen *mainScreen = [UIScreen mainScreen]; CGSize imageSize = mainScreen.bounds.size; if (&UIGraphicsBeginImageContext

在浏览了所有相关问题之后,我了解到drawViewHierarchyInRect应该比renderInContext快得多,但这不是我看到的

以下是我的快照功能和时间分析:

- (UIImage *)screenshot
{
    UIScreen *mainScreen = [UIScreen mainScreen];
    CGSize imageSize = mainScreen.bounds.size;
    if (&UIGraphicsBeginImageContextWithOptions != NULL) {
        UIGraphicsBeginImageContextWithOptions(imageSize, NO, 1);
    } else {
        UIGraphicsBeginImageContext(imageSize);
    }

    CGContextRef context = UIGraphicsGetCurrentContext();

    NSArray *windows = [[UIApplication sharedApplication] windows];
    for (UIWindow *window in windows) {
        if (![window respondsToSelector:@selector(screen)] || window.screen == mainScreen) {
            NSDate *methodStart = [NSDate date];

//            [window.layer renderInContext:context];
            [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:NO];

            NSDate *methodFinish = [NSDate date];
            NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
            NSLog(@"executionTime = %f", executionTime);
        }
    }

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;
}
测试是在装有IOS 9.0的iPad Air上进行的 作为一个测试应用程序,我使用的是UIKitCatalog应用程序

该应用程序显示两个窗口:

<UIWindow: 0x134e4d8f0; frame = (0 0; 768 1024); gestureRecognizers = <NSArray: 0x134e27740>; layer = <UIWindowLayer: 0x134e4d130>>,
<UITextEffectsWindow: 0x134e6a3a0; frame = (0 0; 768 1024); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x134e6aba0>>
使用drawViewHierarchyInRect会在两个窗口的任何一个窗口上产生0.078s renderInContext会在主窗口上显示0.045s,在UitextEffectsSwindow上显示更小的时间(0.000028s)

  • 为什么drawViewHierarchyInRect比renderInContext慢,它不应该更快吗

  • 这两种(78ms,45ms)都不能用于以任何合适的帧速率录制屏幕视频。看起来好像有点不对劲,应该快得多

  • [window.layer RenderContext…]导致屏幕截图混乱且不准确,我尝试过[window.layer.presentationLayer RenderContext…],但这会导致应用程序崩溃,我找不到原因

  • 我将非常感谢您的帮助,我所要做的就是以尽可能高的帧速率录制屏幕视频,到目前为止,我得到的结果毫无意义,或者我可能做了一些非常错误的事情

    谢谢你的提问:

  • 为什么
    drawViewHierarchyInRect
    renderInContext
    慢,不是应该更快吗
  • 这完全取决于你捕获的内容。例如,使用一组简单的
    UIView
    子视图捕获视图时,我看不到明显的差异。当使用复杂的
    UIImageView
    (例如,非常高分辨率的图像)捕获视图时,我发现在极端情况下
    drawViewHierarchyInRect
    的速度大约是10倍。我发现后者的性能差异与苹果声称的相当,他们的例子中包含了大量的图像视图

    我从这些诊断推断,
    drawViewHierarchyInRect
    针对带有
    UIImageView
    对象的屏幕快照进行了优化。因此,虽然它可能针对特定的场景进行了高度优化,但我并不完全惊讶于可能存在一些场景,这些场景并不会产生相同的结果,而这并不是它的初衷

  • 这两种(78ms,45ms)都不能用于以任何合适的帧速率录制屏幕视频。看起来好像有点不对劲,应该快得多
  • 这些不是为视频捕获而设计的,所以我不确定你所说的“有些东西很不对劲”是什么意思。你为什么说“应该快得多”

  • [window.layer renderInContext…]导致屏幕截图混乱且不准确
  • 你应该编辑你的问题,包括屏幕快照,向我们展示你的意思

    。。。我尝试过[window.layer.presentationLayer renderInContext…],但这会导致应用程序崩溃,我找不到原因


    presentationLayer
    方法用于获取当前演示状态的副本(通常用于查询中间动画),但它不是通常与您交互的层。

    您是如何解决此问题的?我也看到了一些性能问题。