2010-03-27 31 views

回答

1

我想可能不是 - 你仍然需要爲視圖分配內存,而不是顯示它。

隨着UIKit瞭解更多關於什麼/不繪製的內容,您可能會獲得非常輕微的性能提升。

但是,您可以自己回答這個問題!製作一個項目,製作1000個1000x1000的視圖並將它們放在屏幕上。然後看看Profiler中的內存使用情況。然後,將clipToBounds設置爲YES並執行相同操作,看看它是否已更改!

我預測它不會但我會對結果感興趣 - 如果你這樣做,請張貼在這裏!窗口 -

1)創建一個新的XCode項目:

謝謝,山姆


編輯

mystify非常合理的意見之後,我做了以下測試它應用

2)使用以下代碼:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    // Override point for customization after application launch 
    [window setClipsToBounds:YES]; 
    [window makeKeyAndVisible]; 

    // Make some views 
    for (int n = 0; n < 100000; ++n) { 
     UIImageView *view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.jpg"]]; 
     [view setFrame:CGRectMake(0, 0, 1000, 1000)]; 
     [window addSubview:view]; 
     [view release]; 
    } 

    return YES; 
} 

3)內置它

4)然它在工具 - 對象分配從模擬器的重新開始。

如預測的那樣,沒有變化 - 大約需要16MB,clipsToBounds設置爲YES或NO。

但是,仍然有幾個問題 -

一)我使用一個UIImageView,以確保我有這樣的需要繪製我的觀點的全部內容 - UI層可以優化不同的不同UIView的子類。 b)我在模擬器中運行它(我沒有iPhone,很方便,我的手機壞了) - 我99%肯定它在設備上沒有任何不同,但我也知道模擬器對於內存泄漏並不是100%準確的,因此在設備上測試也是一個好主意。

+0

你爲什麼不這樣做?這是一個150代表賞金;-)(但感謝提示,要儘快嘗試) – dontWatchMyProfile

+0

一個非常公平的點;)看看我上面的編輯! – deanWombourne

1

我不這麼認爲。 clipsToBounds是指子視圖,而不是視圖本身。 UIView文檔建議將CATiledLayer用於特別大的視圖。 CATiledLayer應該會降低您的內存佔用量,因爲它只會加載實際顯示給用戶的視圖部分(類似Google地圖加載地圖圖塊)。

編輯:順便說一句,UIKit足夠智能,不會呈現不可見的東西,或者是因爲它不在屏幕上或被其他視圖遮擋。但是,由於您已經在內存中保存了整個視圖,因此這不會有助於提高內存使用率,但只能提高渲染速度。

3

clipsToBounds急劇降低性能。嘗試在clipToBounds打開的情況下在滾動視圖中放置一堆視圖,然後在視圖中需要實際剪輯的區域添加一些內容(例如視圖具有圓角半徑),然後運行並滾動。滾動將非常生澀。

你並沒有讓處理器的工作變得更容易,通過告訴它渲染得更少,你給它做了更多的工作來決定要畫什麼和不畫什麼。這佔用了週期。

+1

我剛剛發現這種困難的方式 - 然後做了谷歌搜索「clipsToBounds生澀」,並找到了這個線程。我在滾動視圖中看到一堆視圖,每個視圖都打開了clipsToBounds。這些視圖有圓角,我的滾動是生澀。我正在考慮在每個視圖中創建一個子視圖(使用常規方形角),並使用clipsToBounds對其進行設置,而不是使用圓角。 –

相關問題