2011-11-28 82 views
2

我有一個UI,其中NSCollectionViewItem的視圖的內容是通過CALayers以編程方式繪製的。在調整大小時,我使用CAConstraintLayoutManager來保持子圖層的一致性,但這樣做時我的性能很差。似乎調整窗口的大小會導致調整兩個CATextLayer的大小以適應根層的寬度,並且重定位一個CATextLayer以使其保持右對齊,這導致應用程序花費大部分時間執行CGSScanConvolveAndIntegrateRGB函數(我用過Time Profiler工具)。CALayer Live Resize性能不佳

最「昂貴」的層(即使它是唯一顯示的導致最口吃的那一層)是一個包裝多行CATextLayer。我絕對不知道如何獲得更好的性能(我曾嘗試不使用CAConstraintLayoutManager並使用層對齊,但我得到的是相同的結果)。有沒有人有這個問題?有沒有辦法解決它?

PS:我已經在CATransaction設置YES(是)kCATransactionDisableActions子類的- (void)layoutSublayersOfLayer:(CALayer *)layer執行過程中的佈局管理器和殘疾人所有的動畫,但它似乎並不幫忙。

編輯:我已經禁用字體平滑的文字圖層和性能提高一點點(很少),但它在_ZL9view_drawP7_CAViewdPK11CVTimeStampb(這恐怕是被通過的一個線程調用花費的時間一個可怕的量ATI Radeon驅動程序,我想)。

+0

事實證明,我正在調整所有視圖的大小,而不僅僅是在ScrollView的可見矩形內部可見的大小。我正在實現一種只調整可見視圖的方法,因爲據我所知,沒有內置的方法可以做到這一點,它不是默認行爲。去搞清楚。 – juandemarco

回答

1

我解決了它。有點。它似乎仍然像一個骯髒的劈到我,但我無法找出如何使setNeedsDisplayInRect工作,所以最後我做這樣的:

  1. 在NSWindow代表:

    - (空)windowWillStartLiveResize:(NSNotification *)notification {[NSNotificationCenter defaultCenter] postNotificationName:@「beginResize」object:nil]; }

    - (無效)windowDidEndLiveResize:(NSNotification *)通知 { [[NSNotificationCenter defaultCenter] postNotificationName:@ 「endResize」 對象:無];
    }

  2. 在我的自定義視圖這兩個通知分別致電,該-(void)beginResize-(void)endResize選擇。第一個將BOOL inLiveResize變量設置爲YES,而第二個將其設置爲NO,並再次以新的幀大小調用setFrameSize。

  3. 我重寫(覆蓋不以英語爲母語,對不起?)的-(void)setFrameSize:(NSSize)newSize方法是這樣的:

    -(void)setFrameSize:(NSSize)newSize 
    {   
        if (inLiveResize) { 
         NSRect scrollFrame = [[[self superview] enclosingScrollView] documentVisibleRect]; 
    
         BOOL condition1 = (self.frame.origin.y > (scrollFrame.origin.y - self.frame.size.height)); 
         BOOL condition2 = (self.frame.origin.y < (scrollFrame.origin.y + scrollFrame.size.height + self.frame.size.height)); 
    
         if (condition1 && condition2) 
          [super setFrameSize:newSize]; 
        } 
        else { 
         [super setFrameSize:newSize]; }} 
    

就是這樣。這樣,只有可見的視圖才能在窗口中生效,而其他視圖在操作結束時重新繪製。它可以工作,但我不喜歡它有多'骯髒',我敢肯定,通過使用setNeedsDisplayInRect方法有一種更優雅的內置(ish)方法。我會研究更多。

+0

對不起,我無法弄清楚如何正確格式化代碼 – juandemarco