iOS 優(yōu)化圖像性能問題

前言:在iPhone應(yīng)用中, 會用到大量圖片展示內(nèi)容, 然而圖片處理不當(dāng)會大幅度影響應(yīng)用的性能和整體的流暢性, 本文主要針對UIKit中UIImageView控件進行性能優(yōu)化

開發(fā)時, 可以用模擬器來測試圖片性能。開啟檢測后, 紅色為耗性能, 需要過多的內(nèi)存坞琴、CPU或者GPU來處理UIKit的控件。

模擬器性能檢測
模擬器性能檢測
  • Color Blended Layers: 檢測圖層顏色圖層混合(半透明以及圖像重繪)
  • Color Copied Images: 檢測由Core Animation生成的寄宿圖片(復(fù)制圖片, 實際開發(fā)中極少出現(xiàn))
  • Color Misaligned Images: 檢測圖片大小與顯示的控件是否相符, 控件使圖片縮放和拉伸(不正常的縮放)
  • Color Offscreen-Rendered Yellow: 檢測離屏渲染, 應(yīng)用把圖片在屏幕外做處理, 然后把處理后的結(jié)果存到內(nèi)存中, 等需要用到的時候再取出使用, 相對于普通渲染更占用資源.

首先在控制器中用xib創(chuàng)建一個UIImageView, 用于測試圖片性能.

約束:

圖片約束
圖片約束

優(yōu)化前代碼:

class ViewController: UIViewController {

    
    @IBOutlet weak var iconImgV: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        iconImgV.image = UIImage(named:"icon")
    }
}

**優(yōu)化前: ** 開啟Color Blended Layers, 可以發(fā)現(xiàn)圖片外圍綠色,圖片為紅色, 紅色代表縮放或者拉伸.

優(yōu)化前-開啟檢測
優(yōu)化前-開啟檢測

優(yōu)化后: 可以發(fā)現(xiàn)已經(jīng)沒有紅色區(qū)域.

優(yōu)化后-開啟檢測
優(yōu)化后-開啟檢測

核心代碼:

 /// 獲取性能優(yōu)化后的圖片
    ///
    /// - Parameters:
    ///   - image: 需要處理的圖片
    ///   - size: 圖片顯示的大小
    ///   - hasBorder: 是否顯示邊框(默認false)
    ///   - borderColor: 邊框顏色(默認black)
    ///   - borderWidth: 邊框?qū)挾?默認1.0)
    ///   - isCircular: 是否為圓形(默認false)
    ///   - backgroundColor: 圖片背景色(默認white)
    /// - Returns: 優(yōu)化后的圖片
    func optimizeImage(With image: UIImage?, size: CGSize, hasBorder: Bool = false, borderColor: UIColor = UIColor.black, borderWidth: CGFloat = 1.0, isCircular: Bool = false,backgroundColor: UIColor? = UIColor.white) -> UIImage? {
        
        guard let image = image else {
            return nil
        }
        // 繪制區(qū)域
        let rect = CGRect(origin: CGPoint(), size: size)
        
        // 開啟core Graphic繪制, 在內(nèi)存中開辟一個空間用于處理圖片,獲取圖片Context
        // - size: 圖片大小
        // - opaque: 圖片是否不透明
        // - scale: 圖片倍數(shù), 設(shè)置0會根據(jù)設(shè)備自動調(diào)整@2x或者@3x
        UIGraphicsBeginImageContextWithOptions(size, true, 0)
        
        // 設(shè)置背景色填充, 圖片圓角化后默認背景色為黑色
        backgroundColor?.setFill()
        UIRectFill(rect)
        
        // 創(chuàng)建貝塞爾路線, 用于圓角和邊框
        let path = UIBezierPath(ovalIn: rect)
        if isCircular {
            // 繪制圓形
            if isCircular {
                path.addClip()
            }
            
        }
        // 圖片在制定區(qū)域內(nèi)繪制
        image.draw(in: rect)
        
        // 繪制邊框
        if hasBorder {
            borderColor.setStroke()
            path.lineWidth = borderWidth
            path.stroke()
        }
        
        // 獲取繪制后的圖片
        let optimizeImage = UIGraphicsGetImageFromCurrentImageContext()
        // 關(guān)閉core Graphic繪制
        UIGraphicsEndImageContext()
        
        return optimizeImage
    }

Demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贞瞒,一起剝皮案震驚了整個濱河市叼旋,隨后出現(xiàn)的幾起案子刃麸,更是在濱河造成了極大的恐慌阎抒,老刑警劉巖酪我,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異且叁,居然都是意外死亡都哭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門逞带,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欺矫,“玉大人,你說我怎么就攤上這事展氓∧屡浚” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵带饱,是天一觀的道長毡代。 經(jīng)常有香客問我阅羹,道長勺疼,這世上最難降的妖魔是什么教寂? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮执庐,結(jié)果婚禮上酪耕,老公的妹妹穿的比我還像新娘。我一直安慰自己轨淌,他們只是感情好迂烁,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著递鹉,像睡著了一般盟步。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躏结,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天却盘,我揣著相機與錄音,去河邊找鬼媳拴。 笑死黄橘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屈溉。 我是一名探鬼主播塞关,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼子巾!你這毒婦竟也來了帆赢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤线梗,失蹤者是張志新(化名)和其女友劉穎匿醒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缠导,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡廉羔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了僻造。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憋他。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖髓削,靈堂內(nèi)的尸體忽然破棺而出竹挡,到底是詐尸還是另有隱情,我是刑警寧澤立膛,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布揪罕,位于F島的核電站梯码,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏好啰。R本人自食惡果不足惜轩娶,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望框往。 院中可真熱鬧鳄抒,春花似錦、人聲如沸椰弊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秉版。三九已至贤重,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間清焕,已是汗流浹背并蝗。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耐朴,地道東北人借卧。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像筛峭,于是被迫代替她去往敵國和親铐刘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容