CoreAnimation蚌斩,提供了高幀率和平滑的動畫,使CPU沒有負擔也沒有減慢你的應用程序范嘱。能夠完成繪制動畫的每一幀所需的大部分工作送膳。可以配置動畫參數(shù)丑蛤,比如開始點和結(jié)束點叠聋,然后Core animation完成其余的工作,將大部分工作交給專用的圖形硬件來加速渲染(GPU)
Core Animation位于AppKit和UIKit之下受裹,緊密集成到Cocoa和Cocoa Touch的視圖工作流中碌补。當然,Core Animation也有接口棉饶,可以擴展應用程序視圖所暴露的功能厦章,讓你對應用程序的動畫有更細粒度的控制
Core Animation,它本質(zhì)上可以理理解為一個復合引擎照藻,主要職責包含:渲染袜啃、構(gòu)建和實現(xiàn)動畫。
從上圖可知App使用CoreGraphics,CoreAnimation,CoreImage來繪制可視化內(nèi)容幸缕,然后通過OpenGL ES/Metal啟動GPUDriver群发,進而啟動GPU,然后通過GPU渲染提交到屏幕展示
CoreAnimation,是一個復合引擎发乔,其職責是?盡可能快地組合屏幕上不同的可視內(nèi)容也物,這些可視內(nèi)容可被分解成獨立的圖層(即 CALayer),這些圖層會被存儲在一個叫做圖層樹的體系之中列疗。從本質(zhì)上而言,CALayer?是用戶所能在屏幕上看見的一切的基礎
CoreGraphics,?基于 Quartz 高級繪圖引擎浪蹂,主要用于運行時繪制圖像抵栈。開發(fā)者可以使用此框架來處理基于路徑的繪圖告材,轉(zhuǎn)換,顏色管理古劲,離屏渲染斥赋,圖案,漸變和陰影产艾,圖像數(shù)據(jù)管理疤剑,圖像創(chuàng)建和圖像遮罩以及 PDF 文檔創(chuàng)建,顯示和分析闷堡。當開發(fā)者需要在?運行時創(chuàng)建圖像?時隘膘,可以使用?Core Graphics?去繪制。與之相對的是?運行前創(chuàng)建圖像杠览,例如用 Photoshop 提前做好圖片素材直接導入應用弯菊。相比之下,我們更需要?Core Graphics?去在運行時實時計算踱阿、繪制一系列圖像幀來實現(xiàn)動畫
CoreImage,Core Image?與?Core Graphics?恰恰相反管钳,Core Graphics?用于在?運行時創(chuàng)建圖像,而?Core Image?是用來處理?運行前創(chuàng)建的圖像?的软舌。Core Image?框架擁有一系列現(xiàn)成的圖像過濾器才漆,能對已存在的圖像進行高效的處理。大部分情況下佛点,Core Image?會在 GPU 中完成工作醇滥,但如果 GPU 忙,會使用 CPU 進行處理
App本身并不負責渲染恋脚,渲染由獨立進程Render Server負責
首先腺办,App處理事件(HandleEvents:事件處理)
其次,App通過CPU完成對顯示內(nèi)容的計算(如:視圖創(chuàng)建糟描、布局怀喉、圖片解碼、文本繪制)
在完成以上兩步之后船响,App對圖層進行打包躬拢,在下一個Runloop到來時,將打包數(shù)據(jù)發(fā)送給Render Server(即:完成一次Commit Transaction)
Render Server主要執(zhí)行OpenGL见间、CoreGraphice程序聊闯,OpenGL調(diào)度GPU
GPU在物理層上完成渲染流程(頂點數(shù)組,頂點著色器米诉,片元著色器)
最后:等到下一個Runloop菱蔬,進行顯示
在實際開發(fā)過程中,通常會對界面渲染進行優(yōu)化(防止卡頓出現(xiàn)),卡頓的出現(xiàn)其實與渲染是息息相關(guān)的:
CPU完成對顯示內(nèi)容的計算(如:視圖創(chuàng)建拴泌、布局魏身、圖片解碼、文本繪制)后蚪腐,提交數(shù)據(jù)到GPU箭昵,GPU渲染完成后,將渲染結(jié)果放入到幀緩存區(qū)回季,視頻控制器讀取幀緩存區(qū)信息進行數(shù)模轉(zhuǎn)換(數(shù)字信號轉(zhuǎn)化為模擬信號)家制,逐行掃描視圖控制器從幀緩存區(qū)讀取數(shù)據(jù),然后顯示到屏幕
在這個過程通常會伴隨兩種情況泡一,圖片的撕裂與掉幀
1颤殴、關(guān)于撕裂的理解,撕裂出現(xiàn)的是由于CPU和GPU在計算時瘾杭,有時間等待的诅病;幀緩沖區(qū)顯示的上半部分內(nèi)容是內(nèi)容,下半部分內(nèi)容是新內(nèi)容粥烁;為了解決撕裂贤笆,引入了垂直同步Vsync(相當于給幀緩存區(qū)加鎖,只有信號VSync信號到來時讨阻,圖片掃描完成)以及雙緩沖區(qū)
2芥永、關(guān)于掉幀的理解,掉幀實際上是重復渲染同一幀數(shù)據(jù)钝吮,啟用了垂直同步Vsync+雙緩存區(qū)解決撕裂問題埋涧,接受到垂直信號時,CPU/GPU還未準備好圖片數(shù)據(jù)奇瘦,視頻控制器拿不到FrameBuffer的數(shù)據(jù)棘催,導致掉幀