iOS圖形程式設計總結

cocoachina發表於2014-11-04

iOS實現圖形程式設計可以使用三種API(UIKIT、Core Graphics、OpenGL ES及GLKit)。

這些api包 含的繪製操作都在一個圖形環境中進行繪製。一個圖形環境包含繪製引數和所有的繪製需要的裝置特定資訊,包括螢幕圖形環境、offscreen 點陣圖環境和PDF圖形環境,用來在螢幕表面、一個點陣圖或一個pdf檔案中進行圖形和影像繪製。在螢幕圖形環境中進行的繪製限定於在一個UIView類或其 子類的例項中繪製,並直接在螢幕顯示,在offscreen點陣圖或PDF圖形環境中進行的繪製不直接在螢幕上顯示。

一、UIKIT API

UIKIT是一組Objective-C API,為線條圖形、Quartz影像和顏色操作提供Objective-C 封裝,並提供2D繪製、影像處理及使用者介面級別的動畫。

UIKIT 包括UIBezierPath(繪製線、角度、橢圓及其它圖形)、UIImage(顯示影像)、UIColor(顏色操作)、UIFont和 UIScreen(提供字型和螢幕資訊)等類以及在點陣圖圖形環境、PDF圖形環境上進行繪製和 操作的功能等, 也提供對標準檢視的支援,也提供對列印功能的支援。

在UIKIT中UIView類本身在繪製時自動建立一個圖形環境(對應Core Graphics層的CGContext型別)作為當前的圖形繪製環境。在繪製時可以呼叫UIGraphicsGetCurrentContext 函式獲得當前的圖形環境。

二、Core Graphics 與Quartz 2D API

Core Graphics是一套C-based API, 支援向量圖形,線、形狀、圖案、路徑、剃度、點陣圖影像和pdf 內容的繪製。

Quartz 2D 是Core Graphics中的2D 繪製呈現引擎。Quartz是資源和裝置無關的,提供路徑繪製,anti-aliased呈現,剃度填充圖案,影像,透明繪製和透明層、遮蔽和陰影、顏色 管理,座標轉換,字型、offscreen呈現、pdf文件建立、顯示和分析等功能。

Quartz 2D能夠與所有的圖形和動畫技術(如Core Animation, OpenGL ES, 和 UIKit 等)一起使用。

Quartz採用paint模式進行繪製。

Quartz 中使用的圖形環境也由一個類CGContext表示。

在Quartz 中可以把一個圖形環境作為一個繪製目標。當使用Quartz 進行繪製時,所有裝置特定的特性被包含在你使用的特定型別的圖形環境中,因此通過給相同的影像操作函式提供不同的影像環境你就能夠畫相同的影像到不同的裝置上,因此做到了影像繪製的裝置無關性。

Quartz 為應用提供如下幾個圖形環境:

1)點陣圖圖形環境,用來建立一個點陣圖。

使用函式CGBitmapContextCreate來建立。

2)PDF圖形環境,用來建立一個pdf檔案。

Quartz 2D API提供了兩個函式來建立一個PDF圖形環境:

CGPDFContextCreateWithURL,帶有一個作為pdf 輸出的位置的Core Foundation URL來建立一個pdf 圖形環境。

CGPDFContextCreate, 當想PDF 輸出到一個data consumer時使用該函式。

3) 視窗圖形環境,用來在一個視窗上進行繪製。

4) 層環境(CGLayer) ,是一個與另一個圖形環境關聯的offscreen繪製目標,使用層環境的目的是為了優化繪製層到建立它的圖形環境的效能。層環境能夠比點陣圖圖形環境提供更好的offscreen繪製效能。

Quartz提供的主要類包括:

CGContext:表示一個圖形環境;

CGPath:使用向量圖形來建立路徑,並能夠填充和stroke;

CGImage:用來表示點陣圖;

CGLayer:用來表示一個能夠用於重複繪製和offscreen繪製的繪製層;

CGPattern:用來表示Pattern,用於重複繪製;

CGShading和 CGGradient:用於繪製剃度;

CGColor 和 CGColorSpace;用來進行顏色和顏色空間管理;

CGFont, 用於繪製文字;

CGPDFContentStream、CGPDFScanner、CGPDFPage、CGPDFObject,CGPDFStream, CGPDFString等用來進行pdf檔案的建立、解析和顯示。

三、OpenGL ES和GLKit

OpenGL ES是一套多功能開放標準的用於嵌入系統的C-based的圖形庫,用於2D和3D資料的視覺化。OpenGL被設計用來轉換一組圖形呼叫功能到底層圖形 硬體(GPU),由GPU執行圖形命令,用來實現複雜的圖形操作和運算,從而能夠高效能、高幀率利用GPU提供的2D和3D繪製能力。

OpenGL ES規範本身不定義繪製表面和繪製視窗,因此ios為了使用它必須提供和建立一個OpenGLES 的呈現環境,建立和配置儲存繪製命令結果的framebuffer 及建立和配置一個或多個呈現目標。

在 iOS中使用EAGL提供的EAGLContext類 來實現和提供一個呈現環境,用來保持OpenGLES使用到的硬體狀態。  EAGL是一個Objective-C API,提供使OpenGL ES與Core Animation和UIKIT整合的介面。

在呼叫任何OpenGLES 功能之前必須首先初始化一個EAGLContext 物件。

每一個iOS應用的每一個執行緒都有一個當前context,在呼叫OpenGLES函式時,使用或改變此context中的狀態。

EAGLContext 的類方法setCurrentContext:用來設定當前執行緒的當前context。EAGLContext 的類方法currentContext 返回當前執行緒的當前context。在切換相同執行緒的兩個上下文之前,必須呼叫glFlush函式來確保先前已提交的命令被提交到圖形硬體中。

可以採用不同的方式使用OpenGL ES以便呈現OpenGL ES內容到不同的目標:GLKit和CAEAGLLayer。

為了建立全螢幕的檢視或使OpenGL ES內容與UIKit檢視整合,可以使用GLKit。在使用GLKit時,GLKit提供的類GLKView類本身實現呈現目標及建立和維護一個framebuffer。

為了使OpenGL ES內容作為一個Core Animation層的部分內容時,可以使用CAEAGLLayer 作為呈現目標,並需要另外建立framebuffer以及自己實現和控制整個繪製流程。

GLKit是一組Objective-C 類,為使用OpenGL ES 提供一個物件導向介面,用來簡化OpenGL ES應用的開發。GLKit支援四個3D應用開發的關鍵領域:

1) GLKView 和GLKViewController類提供一個標準的OpenGLES檢視和相關聯的呈現迴圈。GLKView可以作為OpenGLES內容的呈現目 標,GLKViewController提供內容呈現的控制和動畫。檢視管理和維護一個framebuffer,應用只需在framebuffer進行繪 畫即可。

2)GLKTextureLoader 為應用提供從iOS支援的各種影像格式的源自動載入紋理影像到OpenGLES 影像環境的方式,並能夠進行適當的轉換,並支援同步和非同步載入方式。

3)數學運算庫,提供向量、矩陣、四元數的實現和矩陣堆疊操作等OpenGL ES 1.1功能。

4)Effect 效果類提供標準的公共著色效果的實現。能夠配置效果和相關的頂點資料,然後建立和載入適當的著色器。GLKit 包括三個可配置著色效果類:GLKBaseEffect實現OpenGL ES 1.1規範中的關鍵的燈光和材料模式, GLKSkyboxEffect提供一個skybox效果的實現, GLKReflectionMapEffect 在GLKBaseEffect基礎上包括反射對映支援。

使用GLKView和OpenGLES進行繪製過程:

1)建立一個GLKView 物件

GLKView 物件可以程式設計或使用Interface Builder來建立和配置。

在採用程式設計方式時,首先建立一個context然後呼叫initWithFrame:context:方法。

使用Interface Builder方式時,在從storyboard載入一個GLKView後,建立一個context和設定它作為檢視的context屬性.

在iOS中GLKit的使用需要建立OpenGL ES 2.0以上的圖形環境context。

GLKit檢視自動建立和配置它所有的OpenGLES framebuffer物件和renderbuffers,可以通過修改檢視的drawable屬性來控制這些物件的屬性。

2)繪製OpenGL內容(釋出繪製命令)

使 用GLKit檢視繪製OpenGL內容需要三個子步驟:準備OpenGLES基礎;釋出繪製命令;呈現顯示內容到Core Animation。       GLKit類本身已經實現了第一個和第三個步驟,使用者只需實現第二個步驟,在檢視的方法drawRect或檢視的代理物件的 glkView:drawInRect:中呼叫適當的OpenGLES繪製命令進行內容繪製。

GLKViewController類維護一個animation 呈現迴圈(包含兩個方法update和display),用來實現連續的動畫複雜的場景。

animation 呈現迴圈的交替速率由GLKViewController的屬性framesPerSecond 指示,並使用preferredFramesPerSecond 屬性來修改它。

四、其它圖形程式設計相關API

1)Core Animation

Core Animation是一套Objective-C API,實現了一個高效能的複合引擎,並提供一個簡單易用的程式設計介面,給使用者UI新增平滑運動和動態反饋能力。

Core Animation 是 UIKit實現動畫和變換的基礎,也負責檢視的複合功能。使用Core Animation可以實現定製動畫和細粒度的動畫控制,建立複雜的、支援動畫和變換的layered 2D檢視。

Core Animation不屬於繪製系統,但它是以硬體複合和操作顯示內容的基礎設施。這個基礎設施的核心是layer物件,用來管理和操作顯示內容。在ios 中每一個檢視都對應Core Animation的一個層物件,與檢視一樣,層之間也組織為層關係樹。一個層捕獲檢視內容為一個被影像硬體容易操作的點陣圖。在多數應用中層作為管理檢視 的方式使用,但也可以建立獨立的層到一個層關係樹中來顯示檢視不夠支援的顯示內容。

OpenGL ES的內容也可以與Core Animation內容進行整合。

為了使用Core Animation實現動畫,可以修改層的屬性值來觸發一個action物件的執行,不同的action物件實現不同的動畫。

Core Animation 提供了一下一組應用可以採用的類來提供對不同動畫型別的支援:

CAAnimation是一個抽象公共基類,CAAnimation採用CAMediaTiming 和CAAction協議為動畫提供時間(如週期、速度、重複次數等)和action行為(啟動、停止等)。

CAPropertyAnimation是 CAAnimation的抽象子類,為動畫提供一個由一個key路徑規定的層屬性的支援;

CABasicAnimation 是CAPropertyAnimation的具體子類,為一個層屬性提供簡單插入能力。

CAKeyframeAnimation也是CAPropertyAnimation的具體子類,提供key幀動畫支援。

CATransition是CAAnimation的具體子類,提供影響整個層內容的事物效果。

CAAnimationGroup也是CAAnimation的子類,允許動畫物件組合到一起並同時執行。

2)Image I/O

Image I/O 提供讀寫多數格式影像檔案的資料的介面。主要包括影像源CGImageSourceRef和影像目標CGImageDestinationRef兩個類。

3)Sprite Kit

Sprite Kit建立於OpenGL ES之上,Sprite Kit使用圖形硬體來有效的呈現動畫幀,因此可以高幀率地動畫和呈現任意的2D紋理影像或遊戲sprite,呈現的內容包括sprites、文字、CGPath形狀、視訊等。

在Sprite Kit中動畫和呈現由一個SKView檢視物件執行。遊戲的內容組織為以SKScene物件表現的一個個場景。一個場景包含要呈現的sprites和其它內容,一個場景也實現每個幀關聯的邏輯和內容處理。

在同一時刻,一個SKView檢視只呈現一個場景,在場景呈現時,場景關聯的動畫和幀關聯的邏輯被自動執行。在切換場景時使用SKTransition 類來執行兩個場景間的動畫。

4)SceneKit

SceneKit 是一個使用3D圖形技術實現的Objective-C 框架,包含一個高效能的呈現引擎和一個高階的描述性API。可以利用該框架建立簡單的遊戲和介面豐富的使用者UI,使用SceneKit僅需要使用描述性 API描述你的場景的內容(如幾何形狀、材料、燈光和攝像等)和你想在那些內容上要執行的行動或動畫即可。

SceneKit的內容組織為由節點組成的樹形結構,稱為scene graph。一個場景包含一個根節點,定義場景的座標空間,其它節點定義場景的可視內容。SceneKit在GPU上呈現每一幀之前在一個檢視上顯示場景、處理scene graph和執行動畫處理。

SceneKit包含的主要類:

SCNView & SCNSceneRenderer:SCNView是顯示或呈現SceneKit內容的檢視。SCNSceneRenderer是一個協議,定義用於檢視的一些重要方法。

SCNScene: 表現一個場景,是所有SceneKit內容的一個容器。場景可以從使用3D著作工具建立的一個檔案中載入,也可以程式設計建立,場景需要在一個檢視上顯示。

SCNNode:一個場景的基本構造塊,表示scene graph樹的一個節點。scene graph樹定義了場景上節點之間的邏輯結構,通過為一個節點附屬geometries、lights、cameras來提供場景的可視內容。

SCNGeometry、 SCNLight、SCNCamera:分別是geometries、lights、cameras對應的類。SCNGeometry為場景提供形狀、文 本或定製頂點資料,SCNLight為場景提供陰影效果,SCNCamera為場景提供可視點。

SCNMaterial:為SCNGeometry物件定義表面外觀屬性,規定物件表面如何著色或紋理以及如何反應燈光。

SceneKit內容的動畫:

SceneKit動畫基於Core Animation 框架,可以隱式或顯式建立。

隱 式建立是實際是通過動畫節點的一些動畫屬性來實現:SceneKit自動在run loop一次執行期間對一個場景包含節點屬性的所有改變組合成一個原子操作,稱為一個事務,由SCNTransaction 類表示;當設定SCNTransaction類的動畫週期不為0時,所有對節點動畫屬性的改變自動執行動畫。

如下程式碼片段所示:

func fallAndFade(sender:  a href="" AnyObject /a ) { 
    SCNTransaction.setAnimationDuration(1.0) 
    textNode.position = SCNVector3(x: 0.0, y: -10.0, z: 0.0) 
    textNode.opacity = 0.0 
}

顯式建立動畫時,可以選擇CAAnimation一種型別的子類來建立特定型別的動畫。使用key-value為動畫規定屬性及設定動畫引數,然後 把建立的動畫附屬到場景的一個或多個元素。可以使用不同的Core Animation動畫類組合或序列化幾個動畫或建立動畫在幾個 keyframe值之間插入屬性值。

如下程式碼片段為顯式建立動畫的例子:

let animation = CABasicAnimation(keyPath: "geometry.extrusionDepth") 
        animation.fromValue = 0.0 
        animation.toValue = 100.0 
        animation.duration = 1.0 
        animation.autoreverses = true 
        animation.repeatCount = Float.infinity 
        textNode.addAnimation(animation, forKey: “extrude")

SceneKit也支援使用SCNSceneSource 類從一個場景檔案中載入CAAnimation動畫物件,然後附屬它到SCNNode物件。

5)Metal

Metal 框架是一個OpenGL ES類似的底層API,為GPU加速的先進的3D圖形呈現或資料平行計算任務提供支援。Metal負責和3D繪圖硬體互動,為圖形和計算命令的組織、處 理、提交和相關資源和資料的管理提供一個細粒度的、底層的支援流式計算的現代API。Metal的目標是在執行GPU任務時儘量減少CPU的負載,消除在 GPU執行圖形和資料平行計算操作時的效能瓶頸,能夠有效的使用多執行緒並行建立和提交命令到GPU。

Metal也提供了一個對映程式語言用來編寫能夠被Metal應用使用的圖形對映或計算函式。Metal對映語言編寫的程式碼能夠在編譯時與應用程式碼一起被編譯,然後在執行時被載入到GPU上執行;也支援執行時對Metal 對映語言程式碼進行編輯。

在Metal架構中包括如下幾個重要的類或協議:

1、MTLDevice協議和物件

一個MTLDevice代表一個執行命令的GPU裝置,MTLDevice協議為其定義了相關介面,包括查詢裝置能力屬性和建立其它裝置特定的物件等介面,例如建立命令佇列、從記憶體中分配緩衝區以及建立紋理等。

應用通過呼叫MTLCreateSystemDefaultDevice 函式來獲取一個系統能夠使用的MTLDevice物件。

2、命令和命令編碼器

在Metal框架中,3D圖形呈現命令、計算命令和blitting命令在提交到特定裝置GPU上執行前必須進行相應的格式編碼,以便能夠被GPU識別和執行。

Metal框架為每種命令提供了一種編碼器協議:

MTLRenderCommandEncoder 協議:提供介面用來編碼一個單次迴圈呈現期間要執行的3D圖形呈現命令。MTLRenderCommandEncoder 物件用來代表一次圖形呈現流程的呈現狀態和繪製命令。

MTLComputeCommandEncoder協議:提供介面用來編碼資料平行計算任務。

MTLBlitCommandEncoder協議:提供介面用來編碼在緩衝和紋理之間的簡單拷貝操作。

在同一時刻,僅能有一個命令編碼器啟用來新增命令到一個命令緩衝空間上,即每一個命令編碼器必須在另一個使用相同命令緩衝空間的命令編碼器建立前結束。

Metal 為了支援多個不同任務的並行執行,提供了一個MTLParallelRenderCommandEncoder協議來支援多個 MTLBlitCommandEncoder在不同執行緒同時執行提交不同的命令緩衝到同一個命令緩衝空間。每一個執行緒有一個它自己的命令緩衝物件,在同一 時刻,該緩衝物件只能被該執行緒的一個命令編碼器存取。

MTLParallelRenderCommandEncoder物件允許一次呈現迴圈的命令編碼分解到多個命令編碼器進行編碼,使用多執行緒進行並行處理來提高處理效率。

一個命令編碼器物件呼叫endEncoding方法來結束。

命令編碼器物件的建立:

命令編碼器物件由MTLCommandBuffer物件負責建立。MTLCommandBuffer協議定義瞭如下方法用來建立相應型別的命令編碼器物件:

renderCommandEncoderWithDescriptor: 為執行圖形呈現任務建立一個MTLRenderCommandEncoder 物件。方法的引數MTLRenderPassDescriptor表現一個編碼呈現命令的目標(是一個附屬點的集合,最多可以包括四個顏色點資料附屬點、 一個深度點資料附屬點、一個圖案點資料附屬點),在MTLRenderPassDescriptor物件的附屬點屬性中指定要呈現的圖形目標。

computeCommandEncoder方法為資料平行計算任務建立一個MTLComputeCommandEncoder 物件。

blitCommandEncoder 方法為記憶體Blit操作和紋理填充操及mipmaps的產生等操作建立一個MTLBlitCommandEncoder 物件。

parallelRenderCommandEncoderWithDescriptor: 方法建立一個MTLParallelRenderCommandEncoder物件。呈現目標由 引數MTLRenderPassDescriptor規定。

3、命令緩衝MTLCommandBuffer物件及協議

在經過命令編碼器編碼後的命令被命令編碼器新增到一個稱為命令緩衝的MTLCommandBuffer物件上,然後該CommandBuffer物件被提交到GPU來執行其中包含的命令。

MTLCommandBuffer協議為CommandBuffer物件定義介面以及提供命令編碼器的建立、提交CommandBuffer到一個命令佇列以及檢查狀態等操作方法。

一個CommandBuffer物件包含打算在特定裝置(GPU)上執行的被編碼的命令。一旦所有的編碼完成,CommandBuffer本身必須提交到一個命令佇列,並標記命令緩衝為準備好狀態,以便能夠被GPU 執行。

在標準標準應用中,通常一個呈現幀的呈現命令使用一個執行緒被編碼進一個命令緩衝中。

MTLCommandBuffer物件的建立和相應方法:

一個MTLCommandBuffer物件由MTLCommandQueue的commandBuffer方法或commandBufferWithUnretainedReferences方法建立。

一個MTLCommandBuffer物件僅能提交到建立它的MTLCommandQueue 物件中。

一個MTLCommandBuffer物件還實現協議定義的如下方法:

enqueue方法用來在命令佇列中為該命令緩衝保留一個位置。

commit 方法使MTLCommandBuffer物件被提交執行。

addScheduledHandler:方法用來為一個命令緩衝物件登記一個在該命令緩衝被排程時被呼叫的程式碼執行塊。可以為一個命令緩衝物件登記多個排程執行塊。

waitUntilScheduled 方法等待命令緩衝被排程及在為該命令緩衝登記的所有排程執行塊已經執行完。

addCompletedHandler:方法為一個命令緩衝物件登記一個在裝置已經執行完該命令緩衝後被呼叫的程式碼執行塊。也可以為一個命令緩衝物件登記多個完成執行程式碼塊。

waitUntilCompleted 方法等待命令緩衝中命令被裝置執行完和為該命令緩衝登記的所有完成執行塊都執行結束。

presentDrawable:方法用來在命令緩衝物件被排程時呈現一個可顯示資源(CAMetalDrawable 物件)的內容。

4、MTLCommandQueue協議和命令佇列物件

MTLCommandQueue協議為包含命令緩衝的一個佇列。命令佇列用來組織其中包含的命令緩衝物件的執行次序和控制命令佇列中的命令緩衝物件包含的命令什麼時候被執行。

MTLCommandQueue協議為命令佇列定義了介面,主要的介面包括命令緩衝物件的建立。

MTLCommandQueue物件的建立:

使用MTLDevice物件的newCommandQueue方法或newCommandQueueWithMaxCommandBufferCount:方法來建立一個命令佇列物件。

下圖為以上這些物件之間的關係圖:

如圖中所示:必須為一個呈現命令編碼器設定呈現相關的狀態、設定和建立相關的呈現用到的緩衝區、紋理等Metal資源物件。

為呈現命令編碼器指定的狀態包括一個呈現管道流水線狀態(Render Pipeline State),一個深度和圖案狀態(Depth Stencil State),一個取樣狀態(Sampler State)。

一個Blit命令編碼器與一個緩衝區和一個紋理關聯,用來在兩者之間進行Blit操作。

命令編碼器指定圖形或計算功能時可以分配三種型別的MTLResource Metal資源物件使用:

MTLBuffer 表現一個能夠包含任意型別資料的無格式記憶體。MTLBuffer通常用於多邊形頂點vertex、著色器shader及計算狀態資料。

MTLTexture表現一個有著特定紋理型別和點格式的具有相應格式的影像資料。紋理物件可以作為多邊形頂點vertex、片段fragment或計算功能的一個源,也可以在呈現描述符中作為圖形呈現的輸出目標。

MTLSamplerState物件當一個圖形或計算功能在一個MTLTexture上執行紋理取樣操作時使用,用來定義地址、過濾和其它屬性。

圖形呈現編碼器MTLRenderCommandEncoder 可以使用setVertex*及setFragment* 方法組作為其引數來為相應的對映函式分配一個或多個資源。

5、CAMetalLayer 物件和CAMetalDrawable 協議

Core Animation定義了一個CAMetalLayer類和一個CAMetalDrawable 協議用來提供一個Metal內容呈現的層後備檢視。CAMetalLayer物件包含有關要呈現內容的位置、尺寸、可視屬性(背景顏色、邊界和陰影)及 Metal呈現內容使用到的資源等。CAMetalDrawable 協議是MTLDrawable 的擴充套件,指定了可顯示資源物件要符合的MTLTexture協議,使可顯示資源物件可用作呈現命令的目標。

為了實現Metal內容在一個 CAMetalLayer物件的呈現,應為每次呈現流程建立一個CAMetalDrawable物件,從中得到它包含的MTLTexture 物件,然後在呈現流水線描述MTLRenderPipelineDescriptor 的顏色附屬點屬性中使用,指定其為圖形呈現命令的目標。

一個CAMetalLayer物件呼叫CAMetalLayer 物件的nextDrawable 方法來建立。

在建立一個可顯示資源作為圖形命令的目標後,就可以呼叫如下步驟完成圖形的繪製。

1)、首先建立一個MTLCommandQueue 物件,然後使用它建立一個MTLCommandBuffer物件;

2)、建立一個MTLRenderPassDescriptor物件,為其規定用作圖形緩衝中的編碼呈現命令目標的附屬點集合;然後使用這個MTLRenderPassDescriptor 物件建立一個MTLRenderCommandEncoder物件;

3) 建立相應的Metal資源物件,來儲存繪製用到資源資料,如頂點座標和頂點顏色資料;並呼叫MTLRenderCommandEncoder的 setVertex*:offset:atIndex: 和setFragment* :o ffset:atIndex:方法來為呈現編碼器指定用到的資源;

4) 建立一個MTLRenderPipelineDescriptor 物件併為其指定vertexFunction和fragmentFunction 屬性,這些屬性使用Metal對映語言程式碼中讀取的相應對映函式MTLFunction物件來設定。

5) 使用MTLDevice的newRenderPipelineStateWithDescriptor:error:方法或類似方法並根據 MTLRenderPipelineDescriptor建立一個MTLRenderPipelineState物件;然後呼叫 MTLRenderCommandEncoder 的setRenderPipelineState: 方法來為呈現編碼器物件MTLRenderCommandEncoder設定管道流水線;

6)呼叫 MTLRenderCommandEncoder 的drawPrimitives:vertexStart:vertexCount: 方法來執行圖形的呈現,然後呼叫MTLRenderCommandEncoder的endEncoding 方法來結束本次呈現流程的編碼,最後呼叫MTLCommandBuffer 的commit方法來在GPU上執行整個繪製命令。

相關文章