日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Metal之基本简介及常用组件说明

發布時間:2024/5/21 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Metal之基本简介及常用组件说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

  • 在 WWDC 2014 上,Apple為游戲開發者推出了新的平臺技術 Metal,該技術能夠為 3D 圖像提高 10 倍的渲染性能,并支持大家熟悉的游戲引擎及公司。
  • Metal 是一種低層次的渲染應用程序編程接口,提供了軟件所需的最低層,保證軟件可以運行在不同的圖形芯片上。Metal 提升了 A7 與 A8 處理器效能,讓其性能完全發揮。
  • Metal,充分利用GPU的運算能力,在現階段,AVFoundation ?臉識別等大量需要顯示計算的時候,蘋果采用了硬件加速器驅動GPU工作,在音視頻方面,?頻編碼/解碼/視頻編碼/解碼 ->壓縮任務 ->都與硬件加速器分不開,蘋果提供的Metal,能發揮GPU/CPu的最大性能,并且管理我們的資源。
  • Metal優點:
    低CPU開銷;
    最佳GPU性能,即metal 能在GPU上發揮最大的性能;
    最大限度的提高CPU/GPU 的并發性;
    有效的資源管理;

Metal的渲染流程

  • Metal的渲染流程借鑒了OpenGL ES的流程,它通過控制頂點著色器/片元著色器(Metal里面叫頂點函數/片元函數),交給幀緩沖區,最后顯示到屏幕上;
  • 具體流程
    通過CPU將頂點數據傳遞到頂點著色器;
    頂點著色器將處理好的頂點進行圖元裝配;
    然后進行光柵化,得到每個像素點的顏色值;
    然后將顏色傳入片元著色器進行處理;
    最后將數據存儲到幀緩存區,并顯示到屏幕上;
  • 注意:在OpenGL ES中,圖元裝配有9種,在Metal中,圖元裝配只有5種,它們分別是:
    MTLPrimitiveTypePoint = 0, 點
    MTLPrimitiveTypeLine = 1, 線段
    MTLPrimitiveTypeLineStrip = 2, 線環
    MTLPrimitiveTypeTriangle = 3, 三角形
    MTLPrimitiveTypeTriangleStrip = 4, 三角型扇

Metal使用注意

一、Separate Your Rendering Loop

Apple建議我們Separate Your Rendering Loop,即分離渲染,Metal給我們提供了一個View,叫MTKView,它繼承自UiView,它主要的渲染是通過MTKViewDelegate協議回調實現,兩個重要的協議方法是:

  • 當MTKView視圖發生大小改變時調用
/*@method mtkView:drawableSizeWillChange:@abstract Called whenever the drawableSize of the view will chang@discussion Delegate can recompute view and projection matricies or regenerate any buffers to be compatible with the new view size or resolution@paramviewMTKView which called this method@paramsizeNew drawable size in pixels*/- (void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size;
  • 每當視圖需要渲染時調用
/*@method drawInMTKView:@abstract Called on the delegate when it is asked to render into the view@discussion Called on the delegate when it is asked to render into the view*/- (void)drawInMTKView:(nonnullMTKView*)view;
二、Metal驅動GPU工作
  • 命令緩存區(command buffer)是從命令隊列(command queue)創建的
  • 命令編碼器(command encoder)將命令編碼到命令緩存區中
  • 提交命令緩存區并將其發送到GPU
  • GPU執行命令并將結果呈現為可繪制

Metal API

一、MTKView
  • 在MetalKit中提供了一個視圖類MTKView,類似于GLKit中GLKView,它是NSView(macOS中的視圖類)或者UIView(iOS、tvOS中的視圖類)的子類。用于處理metal繪制并顯示到屏幕過程中的細節。
  • 使用metal時,需要先創建MTKView對象,有兩種創建方式:
    直接修改storyboard中view的類;
    使用init創建;
二、MTLDevice
  • 由于metal是操作GPU的,所以需要獲取GPU使用權限,即拿到GPU對象,Metal中提供了MTLDevice協議表示GPU接口,在iOS中一般是通過默認的方式MTLCreateSystemDefaultDevice()獲取GPU
self.view.device = MTLCreateSystemDefaultDevice();
  • metal的使用必須使用真機,且必須是6s及以上的機型,如果設備不支持mental,將會返回空; 如果想使用多個MTLDevice實例,或者從一個MTLDevice切換到另一個,則需要為每個MTLDevice創建單獨的一組對象。
  • MTLDevice協議表示可以執行命令的GPU,提供了如下功能:
    創建新的命令隊列;
    從內存分配緩沖區;
    創建紋理;
    查詢設備功能;
三、MTLCommandQueue
  • 在獲取了GPU后,還需要一個渲染隊列,即命令隊列Command Queue類型是MTLCommandQueue,該隊列是與GPU交互的第一個對象,隊列中存儲的是將要渲染的命令MTLCommandBuffer。
  • 隊列的獲取需要通過MTLDevice對象獲取,且每個命令隊列的生命周期很長,因此commandQueue可以重復使用,而不是頻繁創建和銷毀。
_commandQueue = [_device newCommandQueue];
  • 在繪制之前,首先需要配置好MTKView、MTLDevice以及MTLCommandQueue后,其次是準備渲染到屏幕上的數據,即準備緩存數據MTLCommandBuffer,例如頂點數據等。
  • 基本流程
    先通過MTLCommandBuffer創建渲染緩存區;
    其次通過MTLRenderPassDescriptor創建渲染描述符;
    然后再通過創建的渲染緩存區和渲染描述符創建命令編輯器MTLRenderCommandEncoder 進行編碼;
    最后是結束編碼,提交渲染命令,在完成渲染后,將命令緩存區提交至GPU;
四、MTLCommandBuffer
  • 命令緩存區 Command Buffer主要是用于存儲編碼的命令,其生命周期是知道緩存區被提交到GPU執行為止,單個的命令緩存區可以包含不同的編碼命令,主要取決于用于構建它的編碼器的類型和數量。
  • 命令緩存區的創建可以通過調用MTLCommandQueue的commandBuffer方法,且command buffer對象的提交只能提交至創建它的MTLCommandQueue對象中。
  • commandBuffer在未提交命令緩存區之前,是不會開始執行的,提交后,命令緩存區將按其入隊的順序執行,commandBuffer的提交方式有以下兩種,不同的提交方式表示不同的執行順序:
    ① enqueue:順序執行,enqueue方法在命令隊列中為命令緩存區保留一個位置,此時并未提交命令緩存區,當最終提交命令緩存區后,按照命令隊列的順序依次執行;
    ② commit:插隊盡快執行,如果前面有commit還是需要排隊等待;
五、MTLRenderCommandEncoder

① MTLRenderCommandEncoder表示單個渲染過程中相關聯的渲染狀態和渲染命令,主要功能如下:

  • 指定圖形資源,例如緩存區和紋理對象,其中包含頂點、片元、紋理圖片數據;
  • 指定一個MTLRenderPipelineState對象,表示編譯的渲染狀態,包含頂點著色器和片元著色器的編譯&鏈接情況;
  • 指定固定功能,包括視口、三角形填充模式、剪刀矩形、深度、模板測試以及其它值
    繪制3D圖元;

② 在創建commandEncoder之前,需要先創建渲染描述符MTLRenderPassDescriptor,渲染描述符通過MTKView的currentRenderPassDescriptor獲取

MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;

③ 然后通過commandBuffer結合渲染描述符創建命令編輯器

id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];

④ 使用渲染命令編碼器執行渲染的過程

  • 通過調用MTLCommandBuffer對象的makeRenderCommandEncoder(descriptor :)方法來創建MTLRenderCommandEncoder對象。
  • 調用setRenderPipelineState(_ :)方法以指定MTLRenderPipelineState,該狀態定義圖形渲染管道的狀態,包括頂點和片段函數。
  • 指定用于頂點和片元函數輸入和輸出的資源,并在對應的參數中設置每個資源的位置(即索引),即將頂點數據等通過commandEncoder調用setVertexBytes:length:atIndex:函數傳遞到metal文件的頂點著色器和片元著色器函數
  • 指定其他的固定功能狀態,例如通過commandEncoder調用setViewport:函數設置視口大小等。
  • 繪制圖形。
  • 調用endEncoding()方法以終止渲染命令編碼器。

總結

以上是生活随笔為你收集整理的Metal之基本简介及常用组件说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。