didFinishLaunchingWithOptions之后会发生什么? (无法弄清楚我的表现延迟)

时间:2012-02-10 18:17:45

标签: iphone performance view

我是iOS开发的开始。我的目标是减少应用程序负载期间的负载时间感知。我一直在我的代码中添加“开始”“结束”标志,试图找出应用程序加载期间的延迟。下面是功能入口点和出口列表。我的问题是:

  • didFinishLaunchingWithOptions之后发生了什么?我错过了一个功能吗?

    1 entry: int main(int, char **)
    2 entry:  -[AppDelegate application:didFinishLaunchingWithOptions:]
    3 entry:   -[AppViewController loadView]
    3 exit :   -[AppViewController loadView]
    3 entry:   -[AppViewController viewDidLoad]
    3 exit :   -[AppViewController viewDidLoad]
    3 entry:   -[AppViewController viewWillAppear:]
    3 exit :   -[AppViewController viewWillAppear:]
    3 entry:   -[AppViewController viewDidAppear:]
    3 exit :   -[AppViewController viewDidAppear:]
    2 exit :  -[AppDelegate application:didFinishLaunchingWithOptions:]
    ? ?????:  //Here i see a VERY LONG PAUSE, possibly loading the view into memory?
              //Anyway to reduce this time here?
    //After this long delay the view actually shows up on the phone.
    

我通过使用宏乱丢我的代码来捕获这个:

  • - (void)viewWillAppear:(BOOL)animated
    {
        MARKSTART;
        [super viewWillAppear:animated];
        MARKEND;
    }
    

对于那些可能感兴趣的人,这是我的宏。通过以下网页:http://www.dizzey.com/development/ios/6-useful-objective-c-cocoa-macros/

  • #define MARK      NSLog(@"----%s", __PRETTY_FUNCTION__);
    #define MARKSTART NSLog(@"/===Entry: %s ===\\", __PRETTY_FUNCTION__);
    #define MARKEND   NSLog(@"\\===Exit : %s ===/", __PRETTY_FUNCTION__);
    

其他信息:

  • 我在xib文件中有很多按钮。
  • 通过用
  • 替换背景颜色或图像来对控件进行蒙皮处理
  • PNG图像加载实际上发生在viewDidLoad中,磁盘IO非常快
  • 最新的延迟感觉就像“视图”实际被加载到内存中一样,但我无法确定。

有关谁可以深入研究这个问题并找到更好的方法来更快地加载我的应用程序,或者认为它加载速度更快的建议?我最头疼的是非常长的停机...在iPhone 3g(4.2.1 ios)上需要大约4.2秒。

请指教, 框

基于评论的其他详细信息构成了该主题。 ViewDidLoad中的以下代码。这种情况发生得非常快,最多只需要200毫秒:

wholeImage = [UIImage imageWithContentsOfFile:@"DefaultSkin.png"];
CGImageRef drawImage;

drawImage = CGImageCreateWithImageInRect(wholeImage.CGImage, CGRectMake(0, 0, 320, 480));
imageMainBackground = [[UIImage imageWithCGImage:drawImage] retain];
CGImageRelease(drawImage);

drawImage = CGImageCreateWithImageInRect(wholeImage.CGImage, CGRectMake(320, 0, 320, 480));
imageAnotherBackground = [[UIImage imageWithCGImage:drawImage] retain];
CGImageRelease(drawImage);

我继续这一点,将大的“整个图像”切割成按钮和控件。同样在ViewDidLoad期间,我会将它们分配给视图和子视图,如下所示:

[self.view setBackgroundColor:[UIColor colorWithPatternImage:[GuiSkinManager sharedSingleton].imageMainBackground]];

调试输出控制台显示带有这些NSLog输出的ViewDidLoad:

2012-02-10 12:43:11.150 App [1714:307] Entry: -[AppViewController viewDidLoad]
2012-02-10 12:43:11.467 App [1714:307] Exit : -[AppViewController viewDidLoad]

因此调试时设置和切割仅为310ms。但此时图像本身并未实际处理?

1 个答案:

答案 0 :(得分:0)

因此,您的问题似乎是使用setBackgroundColor而不是使用UIImageView。我猜这是因为setBackgroundColor适用于使用平铺的小图像而不是单个背景图像的情况。 UIImageView将针对绘制单个图像进行超级优化。无论如何,我认为这是正在发生的事情。

这里故事的寓意是使用乐器。这是一个很好的工具,可以真正帮助追踪一些问题。在计算占用CPU时间的时候,“Time Profiler”仪器是一个很好的帮助。