2012-02-10 48 views
0

我是iOS開發的開始。我的目標是減少應用程序加載期間的加載時間感知。我一直在我的代碼中添加「開始」「結束」標誌,試圖找出我的應用程序加載期間的延遲。以下是功能入口點和出口的列表。我的問題是:didFinishLaunchingWithOptions後會發生什麼? (無法弄清我的表現延遲)

  • 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__); 
    

其他信息:

  • 我在廈門國際銀行文件的按鈕。
  • 控制通過與一些
  • PNG圖像加載實際發生在viewDidLoad中更換背景顏色或圖像剝皮,磁盤IO是相當快
  • 最新的延遲的感覺,當「視圖」實際上是被加載到像記憶,但我不能確定。

任何關於誰可以深入研究並找到更好的方法來加快我的應用程序加載速度,或者認爲加載速度更快的建議?我最大的頭痛是非常長的暫停...在iphone 3g(4.2.1 ios)大約需要4.2秒。

請指教, 箱

基於評論其他詳細信息形成的螺紋。以下代碼在ViewDidLoad內部。這種情況發生得很快,最多需要200ms:

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]]; 

調試輸出控制檯顯示的viewDidLoad這些的NSLog輸出:

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,而調試。但圖像本身實際上並沒有在這個時候被處理?

+0

你有沒有試過在長時間停頓期間按「暫停」,看看它在什麼方法?還是時間分析儀? – mattjgalloway 2012-02-10 18:22:25

+0

「//在這裏我看到一個非常長的暫停,可能將視圖加載到內存中?」 - 不,當viewDidLoad被調用時,視圖已經被加載。 – 2012-02-10 18:23:13

+0

@mattjgalloway:當我暫停調試器時,它顯示我有四個線程。 1. Main 2._pthread_wqthread 3. __stack_chk_fail 4._pthread_start。 「非常長的暫停」讓我暫停並暫停調試器幾次。除了彙編語言之外我什麼也沒看到。幾個不同的暫停向我展示了線程1上的「gzopen」。但彙編器中沒有提供它正在做什麼的提示。 – BoxCat 2012-02-10 18:27:19

回答

0

所以看來你的問題是使用setBackgroundColor而不是使用UIImageView。我想這是因爲setBackgroundColor是用於當你使用平鋪的小圖像,而不是單個背景圖像。 A UIImageView將爲繪製單個圖像進行超級優化。我想這就是發生了什麼事情。

這裏故事的寓意是使用儀器。這是一個非常好的工具,可以幫助您追蹤許多問題。 「時間分析器」工具在計算CPU時間的時候非常有用。

+0

謝謝亞光。 Yup同意,另外的道德是使用基於模式的顏色遠離setBackgroundColor。 – BoxCat 2012-02-27 04:46:47

相關問題