2017-10-14 82 views
4

我想創建一個適用於METAL Api(iOS)的框架。我對這個平臺很新,我想知道如何構建框架來處理.metal文件(我正在構建一個靜態庫,而不是動態的)。它們應該是.a文件的一部分,還是作爲框架捆綁中的資源文件?或者還有其他方法可以做到這一點嗎?謝謝。作爲iOS框架的一部分的金屬文件

更新: 對於那些誰解決這個 - 我結束了以下warrenm的1所建議的選項 - 轉換的。金屬文件轉換成一個字符串,並調用newLibraryWithSource:options:error:。 雖然它不是最好的性能,但它允許我只發佈一個框架文件,無需額外的資源導入。對於創建使用Metal,ARKit等與着色器文件的框架的人來說,這可能很有用。

+0

很高興你找到了適合你的方法。對於後人,我在下面進行了評論,並共享了一個概念驗證項目,該項目允許您保持着色器預編譯的好處,同時仍然只發送一個文件。如果我在生產中這樣做,那幾乎肯定是我會採取的方法。 – warrenm

回答

7

有很多方法可以爲靜態庫提供金屬着色器,所有這些都有不同的折衷。我會盡力在這裏列舉他們。

1)將您的.metal文件轉換爲靜態字符串,並將其烘焙到您的靜態庫中。

這可能是最糟糕的選擇。這個想法是,你將你的Metal着色器代碼預處理成字符串文字包含在你的靜態庫中。然後,您將使用newLibraryWithSource:options:error: API(或其異步兄弟)將源變成MTLLibrary並檢索函數。這要求您設計一個執行.metal到字符串轉換的過程,並且您將失去着色器預編譯的優勢,從而導致生成的應用程序變慢。

2)船舶。金屬文件旁邊的靜態庫,並要求圖書館用戶將其添加到自己的應用目標

所有的事情考慮,這是一個不錯的選擇,儘管它把更多的負擔壓在你的用戶和暴露你的金屬着色器源(如果這是一個問題)。靜態庫中的代碼可以使用「默認庫」(newDefaultLibrary),因爲代碼將由Xcode自動編譯到應用程序的default.metallib中,該應用程序作爲資源嵌入到應用程序包中。

3)船舶.metallib文件旁邊的靜態庫

這是易用性的使用,性能之間的安全性良好的中間地帶,和(因爲它不會暴露你的着色器源,僅其IR )。基本上,你可以在你的項目中創建一個「金屬庫」目標,把你的着色器代碼放入其中。這將生成一個.metallib文件,您可以隨同您的靜態庫一起發貨,並將您的用戶作爲資源嵌入到其應用目標中。您的靜態庫可以在運行時使用newLibraryWithData:error:newLibraryWithURL:error: API加載.metallib。由於着色器將被預編譯,所以創建庫會更快,並且您將保持編譯時診斷的優勢。

+0

感謝您的詳細解答。只是爲了說清楚 - 如果我不想向用戶發送另一個文件 - 第一個解決方案只有一個適合? – DocForNoc

+0

我想你可以嵌入預編譯的庫,方法是從一個metallib文件中獲取字節,並將它們寫入靜態庫源文件中的字節數組中。這將滿足單個文件的要求,同時也提供了預編譯的好處。 – warrenm

+0

我剛剛測試了最後一種方法,它確實有效。這是一個概念驗證項目,完成所有工作:構建一個''。metallib',將其燒成一個頭文件,並在運行時創建一個'MTLLibrary',從中可以生成管道:https://www.dropbox.com/s/8w30r1gyutj9twc/EmbeddedKernelSample.zip?dl=0。這絕不是生產就緒,但它應該足以說明方法。 – warrenm

相關問題