用分布式壓縮貼圖加快 Unity3D 的打包過程

zpjg9555 9年前發布 | 34K 次閱讀 Unity3D 分布式系統 游戲開發

U3D 的打包流程,誰用誰知道。

由于輸出 ios 包必須在 xcode 環境,跑在 Mac 系統上,所以為了定期版本打包,我們采購了配置比較高的垃圾桶來做。一臺大約要三萬 RMB 左右。

但我覺得這個方案的性價比太低了。

經過簡單的考察,我發現,打包流程中最慢的環節是貼圖壓縮。在不同的平臺,需要把原始貼圖文件壓縮成對應平臺的壓縮貼圖格式: ios 平臺對應的是 PVR 壓縮格式;Android 平臺對應的是 ETC 壓縮格式,等等。

u3d 自己也意識到壓縮貼圖太慢,所以官方給出了一個 CacheServer 方案。

本質上 CacheServer 只是一個文件 cache 服務器,它記錄了用貼圖原文件和轉換參數(u3d 的 meta 文件)以及轉換器版本等信息構成的串的 md5 值作為文件的索引。

第一個做轉換的人,在本地壓縮完畢后,會將結果上傳到 CacheServer ,然后后面的人需要做相同的壓縮時,去 CacheServer 查找是否之前有人做過同樣的工作,避免重復操作。

當源文件相同、轉換參數也完全一樣時,結果會被緩存。由于日常幾乎所有貼圖都被人壓縮過,這樣極大的減少了定期打包的時間。

CacheServer 的設計雖然簡單,卻不能最好的解決問題。實際打包時,還是需要很長的時間。這是因為,定期打包需要輸出各個平臺的包,而日常開發只會穩定在一個平臺上。比如日常工作使用的都是 Android 平臺的話,等打 ios 包時,依舊需要壓縮 pvr 貼圖。

CacheServer 只做結果緩存,所以不可能在 Server 那里針對源圖自動做多個版本的壓縮格式;而且它保存的是轉換參數的 hash 值,丟失了參數信息。btw,它的實現也是非常粗糙的。

U3D 轉換圖片的另一個問題是,導入貼圖時會在本地機器上進行大量的貼圖壓縮工作,這個工作是極耗 CPU 的,把工作機卡上幾秒不能動彈是常用的事,非常影響工作心情。

綜上,我想實現一個遠程壓縮貼圖的方案。

U3D 調用的是一個叫作 PVRTexTool 的命令行工具壓縮貼圖的。這是 PowerVR 公司提供的官方工具,幸運的是,它有 Linux 版本。這樣我們就可以有辦法用廉價的 linux 服務器來做這件事情,而不必采購昂貴的 Mac 垃圾桶。

最簡單的方案是替換掉本地的 PVRTexTool 命令行工具,將源貼圖上傳到遠程服務器,然后遠程調用該工具壓縮貼圖,最后再把結果文件傳回來。

做過改造之后,打包流程中最消耗 CPU 的工作就被轉移走了。經過簡單的測試,配合一個性能并不算強的 8 核服務器輔助壓縮貼圖,在 Mac Mini 上打包也可以比 4 核的垃圾桶工作站快上 30% 。而實際使用時,可以用采購垃圾桶一半的錢買到性能高幾倍的 32 核服務器。

更重要的是,這個遠程打包服務,還記錄了每次壓縮貼圖請求的原始圖片和壓縮參數。我們可以寫一個腳本,安排在夜間運行,找出白天提交的壓縮請求,把命令行中的 -f 參數換掉(控制生成何種平臺的壓縮格式),為每個平臺的壓縮格式都生成一次。這可以解決只用 CacheServer 不能自動生成全平臺壓縮貼圖的問題。

除了打包機外,開發人員的桌面開發機也可以部署這個工具,提高導入圖片的使用體驗(不再依靠本地工具壓縮圖片,不會因為導入貼圖而卡住工作機)。

 

 

來自:http://blog.codingnow.com/2016/12/unity3d_remote_pvrtextool.html

 

 本文由用戶 zpjg9555 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!