2012-02-07 109 views
3

我已經用下面的代碼子類化了UILabel,它工作正常 - 但是任何涉及子類的動畫運行速度比普通UILabels慢很多。我假設Quartz是罪魁禍首,但是我能做些什麼來加快速度?iOS - 在iPhone 4S上緩慢動畫(但在模擬器上很好)

- (void)drawTextInRect:(CGRect)rect 
{ 
    CGSize shadowOffset = self.shadowOffset; 
    UIColor *textColor = self.textColor; 

    // Establish the Quartz 2D drawing destination: 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(context, 1); 
    CGContextSetLineJoin(context, kCGLineJoinRound); 

    // Draw the label’s outline: 
    CGContextSetTextDrawingMode(context, kCGTextStroke); 
    self.textColor = [UIColor whiteColor]; 
    [super drawTextInRect:rect]; 

    // Draw the label: 
    CGContextSetTextDrawingMode(context, kCGTextFill); 
    self.textColor = [UIColor textColor]; 
    self.shadowOffset = CGSizeMake(0, 0); 
    [super drawTextInRect:rect]; 

    self.shadowOffset = shadowOffset; 
} 

回答

5

@MobileOverlord說的肯定是適用的,特別是關於有關分析部分。

我會注意到,設置shouldRasterize = YES並不是一個全面的解決方案(爲什麼Apple沒有將它設置爲默認值,如果是這種情況呢?)。是的,它可以提高滾動性能,但它可以以犧牲內存使用爲代價,因爲最終可能會在緩存中放置大量大圖像。

它在創建時也會產生開銷,我相信(但必須檢查以確保)包括屏幕外渲染傳遞以實際創建柵格化副本。取決於圖層的使用方式,這可能會影響性能。

要考慮的另一個因素是您的視圖是否具有透明度。如果你可以向框架保證你的視圖是不透明的(比較。setOpaque/isOpaque),他們可以通過不考慮與alpha通道相關的所有複雜性來優化渲染。類似的考慮適用於CALayer。

最後,在你展示的代碼塊之外,你是否對背層做了任何偷偷摸摸的事情(例如設置陰影或角落半徑)?這也是一種快速殺死動畫效果的方法。

+0

我同意康拉德。優秀的加法。 – MobileOverlord 2012-02-08 01:40:09

3

你完成繪製標籤,你可以把它的層上shouldRasterize,並應加快動畫後。

shouldRasterize一個布爾值,指示在合成之前該圖層是否作爲位圖呈現爲 。動畫

@property BOOL shouldRasterize討論當此 屬性的值是YES,該層在其本地 座標空間渲染爲位圖,然後合成到目的地與任何其他 內容。陰影效果和濾鏡屬性中的任何濾鏡都是 柵格化幷包含在位圖中。但是,該層的當前不透明度未被光柵化。如果柵格化位圖在合成期間需要縮放 ,則會根據需要應用縮小過濾器和縮放過濾器屬性中的過濾器。

當此屬性的值爲NO時,圖層將盡可能直接合併到目標 。如果合成模型的某些特徵(例如包含濾波器)需要它,那麼該層在合成之前可能仍然被光柵化。

此屬性的默認值爲NO。

CALayer Class Reference

模擬器總是要給你的方式更好的結果不是設備會因爲它能夠使用你的系統的全部處理能力和內存。這樣你通常會得到有缺陷的結果。無論您何時將CoreGraphics與CoreAnimation一起繪製,在真實設備上測試結果都很重要。

爲此,您可以嘗試在樂器核心動畫工具中運行您的應用程序以嘗試查找肇事者。看看我的教程。

Instruments – Optimizing Core Animation

+0

這個答案幫助了我。我允許用戶在運行時更改「UIImageView.Layer」的'MagnificationFilter'。它在模擬器中工作,但顯示器不會在設備上更新。啓用'ShouldRasterize'解決了我的問題。 – 2012-06-11 20:26:41

相關問題