有很多方法可以爲靜態庫提供金屬着色器,所有這些都有不同的折衷。我會盡力在這裏列舉他們。
1)將您的.metal文件轉換爲靜態字符串,並將其烘焙到您的靜態庫中。
這可能是最糟糕的選擇。這個想法是,你將你的Metal着色器代碼預處理成字符串文字包含在你的靜態庫中。然後,您將使用newLibraryWithSource:options:error:
API(或其異步兄弟)將源變成MTLLibrary
並檢索函數。這要求您設計一個執行.metal
到字符串轉換的過程,並且您將失去着色器預編譯的優勢,從而導致生成的應用程序變慢。
2)船舶。金屬文件旁邊的靜態庫,並要求圖書館用戶將其添加到自己的應用目標
所有的事情考慮,這是一個不錯的選擇,儘管它把更多的負擔壓在你的用戶和暴露你的金屬着色器源(如果這是一個問題)。靜態庫中的代碼可以使用「默認庫」(newDefaultLibrary
),因爲代碼將由Xcode自動編譯到應用程序的default.metallib
中,該應用程序作爲資源嵌入到應用程序包中。
3)船舶.metallib文件旁邊的靜態庫
這是易用性的使用,性能之間的安全性良好的中間地帶,和(因爲它不會暴露你的着色器源,僅其IR )。基本上,你可以在你的項目中創建一個「金屬庫」目標,把你的着色器代碼放入其中。這將生成一個.metallib
文件,您可以隨同您的靜態庫一起發貨,並將您的用戶作爲資源嵌入到其應用目標中。您的靜態庫可以在運行時使用newLibraryWithData:error:
或newLibraryWithURL:error:
API加載.metallib
。由於着色器將被預編譯,所以創建庫會更快,並且您將保持編譯時診斷的優勢。
很高興你找到了適合你的方法。對於後人,我在下面進行了評論,並共享了一個概念驗證項目,該項目允許您保持着色器預編譯的好處,同時仍然只發送一個文件。如果我在生產中這樣做,那幾乎肯定是我會採取的方法。 – warrenm