11

場景: 我們有一個iOS遊戲的XCode項目,其中大約有7000多個文件。在XCode 4.5上爲一個巨大的遊戲項目提高構建時間

只有1000多個文件是代碼。其餘的是圖像,聲音,級別數據,XIB,plists,配置文件等。

它是一個通用的應用程序,因此,我們有舊的iPhone,視網膜iPhone,iPad等資源單獨設置。我們也有PNG PVRTC用於BG圖像等少數事情,以充分利用不同的硬件。

問題:

眼下該項目大約需要

42秒清潔(Cmd的 - 轉移 - K)

8.3分鐘的完全重建(Cmd的 - B )(重建時,進度條的一半填充1分鐘)

aaaand ... 5分36剛剛運行(Cmd - R)?

之後,我按下「停止」,再次點擊「運行」,而沒有做任何其他的事情。而它花了2分40秒只是「再次運行」

我還看到資源被複制再次,一些文件重新構建,如XCode上方進度條所示。

任何解決方案,以減少任何這些階段的時間,高度讚賞。請 ?

附:該項目在XCode 3天期間開始,並且每次新XCode出來時我們都會自動更新xcodeproj文件。

+0

我不是在尋找一個神奇的按鈕。但是,由於XCode在編譯/構建階段沒有提供任何信息,因此我正在尋找類似以下解決方案的解決方案:是否有詳細模式可以打開?命令行構建幫助我排除爲什麼需要這麼長時間?等等 –

+0

根據構建日誌,您對我們有任何更新,關於哪些構建階段是最昂貴的階段? – Mecki

+0

@Mecki非常感謝您的指導!我設法找出了一些步驟來減少構建/運行時間的一半或三分之一。 1)驗證產品花了很長時間。有人已經在目標設置中設置了生成的產品「開啓」。我把它關掉了。 (至少現在是'調試') 2)發現dSYM文件生成需要一段時間。因此,遵循這個問題 - http://stackoverflow.com/q/8454937/121067 3)由於粗心的編碼習慣,整個項目中還有太多的警告(1000+)。只是手動關閉了其中的很多。 –

回答

6

如果問題原因未知,則無法解決問題。 「我的汽車不再啓動了,是否有辦法讓它重新開始?」;最有可能的,但只有當它目前拒絕開始的原因是已知的。這聽起來有點像你希望Xcode中有一個名爲「快速構建」的魔術開關,通過啓用它,一切都變得更快。如果有這樣的交換機,你不認爲它會默認啓用嗎?你不覺得它實際上總會被啓用嗎?

我也想知道爲什麼你用「編譯器」和「編譯器優化」來標記這個問題。根據你自己的說法,在8.3分鐘的編譯時間內編譯只需要一分鐘,那麼如何進一步縮短編譯時間會使整個過程更快?即使編譯時間減少到零,這仍然會讓您的編譯時間縮短7.3分鐘。不要在錯誤的末端進行優化。

這就像優化代碼。如果你的代碼太慢,如果你的代碼中大部分時間都花在了代碼中,那麼所有的優化都毫無意義。如果只有0.1%的時間花在這段代碼中,優化一段代碼以使其運行速度提高十倍,將不會對整體性能產生任何影響。代碼優化的第一步是分析代碼並找出在哪段代碼上花費了多少時間。

所以爲了讓你的構建過程更快,第一步也是最重要的一步是找出爲什麼構建時間現在很慢。沒有這些知識,人們在這裏可能給出的所有答案只是猜測到藍色。一旦你確切地知道問題出在哪裏,你可以回過頭來問一下如何更快地做到這一步。您首先優化最慢的步驟,然後再慢一點,等等。

看看生成日誌在Xcode

enter image description here

確保選擇「全部消息」,否則,你只會看到警告和錯誤,或僅錯誤。現在開始一個乾淨的構建,選擇彈出到左側的新日誌並繼續監視此日誌。您將完全看到Xcode何時開始操作以及何時接近下一個操作。這應該給你第一印象,哪些任務需要相當長的時間才能完成。一旦你告訴我們這些任務是什麼,我們就可以開始建議你如何能夠以更快的速度完成這項任務。

+0

很酷,感謝編譯日誌的東西。實際上,我正在尋找可以在哪些階段找出方法,編譯器需要更多時間。我會運行它並讓你知道。 –

+2

-1。最後兩段很有用,剩下的兩段對我來說就像是粗魯無禮。 – TarkaDaal

+2

@TarkaDaal是的,如果我剛剛解決了這個問題,那麼當然這會更不禮貌,就像大多數人所做的一樣,如果問題沒有足夠的信息來解決問題的話。我寧願教育人們在未來提出好問題,因爲這會幫助他們更好地回答問題,並讓他們更快地獲得答案。 OP不認爲這是粗魯的,我寧願認爲你的評論非常粗魯。 – Mecki

7

您在尋找的是改進您的編譯和啓動時間調試,對吧? 那麼爲每個平臺創建不同的目標呢?因此,您保留相同的代碼,但僅根據您的調試設備打包一部分資源用於調試目的。

要做到這一點,去實際目標,右鍵單擊並重復。保持你的實際目標不變,這是脂肪! 對於新的目標,我們假設它是iPad視網膜,進入「構建階段」 - >「複製束資源」,並刪除所有與iPad Retina無關的資源。 爲每個平臺都做同樣的事情。

然後在Xcode的左上角,爲特定設備選擇合適的目標。也許,你可以定義哪個設備被接受的目標。

如果您使用持續集成,讓您的生成機在晚上編譯胖目標。

+1

爲什麼他需要每個平臺有不同的目標?在調試器中啓動目標(這是默認的BTW)時,您可以告訴Xcode僅爲您當前的平臺構建,因此除非您執行部署構建,否則Xcode不會真正爲所有平臺構建。另外你的建議隻影響編譯時間,提問者說編譯只有8分鐘以上。即使你可以立即編譯,他仍然需要等待7分鐘。 – Mecki

+0

不,有着不同的目標,你可以說你不希望iPhone的視網膜資源發送到你的iPad視網膜設備。 ipa將會更小,上傳到您的iPad更快。這裏的關鍵是**資源** –

+0

只有這樣,如果視網膜和非視網膜設備有不同的資源,情況可能並非如此。例如。爲了節省空間,所有圖像可能只存在於視網膜質量中,並且在加載或甚至被繪製時被縮小。特別是對於大多數資源都被加載爲紋理的OpenGL遊戲而言,兩種設備都只有一套紋理的情況並不少見(視網膜紋理通常幾乎不會爲您購買任何東西,進一步的OpenGL可用於降低GPU上的紋理幾乎沒時間)。 – Mecki