Core Image程式設計指南翻譯七(獲得最佳效能)

weixin_34249678發表於2019-01-15

Core Image提供了許多用於建立影象,上下文和渲染內容的選項。您如何選擇完成任務取決於:

  • 您的應用需要多長時間執行一項任務
  • 您的應用是否適用於靜態或視訊影象
  • 是否需要支援實時處理或分析
  • 色彩保真度對您的使用者有多重要
    您應該閱讀效能最佳實踐,以確保您的應用程式儘可能高效地執行。

效能最佳實踐

遵循這些做法以獲得最佳效能:

  • CIContext每次渲染時都不要建立物件。

上下文儲存了大量的狀態資訊; 重用它們更有效。

  • 評估您的應用是否需要色彩管理。除非您需要,否則不要使用它。看看你的應用需要色彩管理嗎?
  • 在CIImage使用GPU上下文渲染物件時避免使用Core Animation動畫。

如果您需要同時使用兩者,則可以將兩者都設定為使用CPU。

  • 確保影象不超過CPU和GPU限制。

CIContext物件的影象大小限制因Core Image是使用CPU還是GPU而異。使用方法inputImageMaximumSize和檢查限制outputImageMaximumSize。

  • 儘可能使用較小的影象。

效能隨輸出畫素數量而變化。您可以將Core Image渲染為較小的檢視,紋理或幀緩衝區。允許Core Animation升級以顯示大小。

  • 使用Core Graphics或Image I / O函式進行裁剪或縮減取樣,例如函式CGImageCreateWithImageInRect或CGImageSourceCreateThumbnailAtIndex。

  • 在UIImageView類的工作最好的靜態影象。
    如果您的應用需要獲得最佳效能,請使用較低階別的API。

  • 避免CPU和GPU之間不必要的紋理傳輸。

  • 在應用內容比例因子之前,渲染到與源影象大小相同的矩形。

  • 考慮使用更簡單的過濾器,它可以產生類似於演算法過濾器的結果。

例如,CIColorCube可以產生類似於CISepiaTone的輸出,並且可以更有效地完成。

  • 利用iOS 6.0及更高版本中對YUV影象的支援。
    相機畫素緩衝區本身就是YUV,但大多數影象處理演算法都需要RBGA資料。在兩者之間進行轉換需要付出代價。Core Image支援從CVPixelBuffer物件讀取YUB 並應用適當的顏色轉換。
options = @ {(id)kCVPixelBufferPixelFormatTypeKey:
    @(kCVPixelFormatType_420YpCbCr88iPlanarFullRange)};

您的應用需要色彩管理嗎?

預設情況下,Core Image會將所有濾鏡應用於淺色線性色彩空間。這提供了最準確和一致的結果。

轉換為sRGB和從sRGB轉換會增加過濾器的複雜性,並要求Core Image應用這些等式:

rgb = mix(rgb.0.0774,pow(rgb * 0.9479 + 0.05213,2.4),step(0.04045,rgb))
rgb = mix(rgb12.92,pow(rgb * 0.4167)* 1.055  -  0.055,step(0.00313,rgb))

在以下情況下考慮禁用顏色管理

  • 您的應用需要絕對最高的效能。
  • 誇大的操作後,使用者不會注意到質量差異。

要禁用顏色管理,請將kCIImageColorSpace金鑰設定為null。如果您正在使用EAGL上下文,還要在建立EAGL上下文時將上下文顏色空間設定為null。請參閱使用CoreImage上下文構建自己的工作流。

相關文章