sdk|王者QQ微信都在用的動畫神器要開源了:把交付時間縮短90%( 三 )


PAG究竟是怎么解決它們的?
我們與PAG的研發團隊、騰訊PCG發布器中臺下編輯子工作組的負責人Dom取得了聯系,了解了背后的實現原理。
PAG背后的技術門道Dom表示,PAG早期最有挑戰的地方,其實就在于“動畫文件設計”和“全AE特性支持”這兩部分。
高效動畫文件
在輸出文件格式方面,已有的JSON等格式存在兩大問題:解碼速度慢、壓縮率低。
為此,團隊重新設計了一種名為.pag的文件格式,采用二進制數據結構來存儲動畫信息。
一方面,二進制數據結構不需要做字符串匹配、序列化等操作,解碼速度會比JSON等格式的文件快上許多。測試數據顯示,在解碼速度上,PAG格式的動畫文件要比JSON文件快12倍。
另一方面,相比于JSON,二進制數據結構具有更高的壓縮率。
JSON文件導出的冗余信息較多,而二進制的數據結構則能跳過大量默認值存儲,并使用動態比特位來緊湊存儲。因此相同的動畫內容,PAG文件比同類型方案壓縮文件小50%左右。
此外,采用二進制數據結構還有一個額外的好處,在導出動畫文件時不用再搭配“圖片包”(外掛圖片),一個文件就能搞定,包括音頻也能夠內置。
sdk|王者QQ微信都在用的動畫神器要開源了:把交付時間縮短90%
文章插圖
全AE特性支持
說完文件格式,再來看看PAG文件是如何做到支持所有AE效果的。
這個特性使得PAG文件既能實時預覽復雜特效,又能確保動畫的可編輯性,但在之前,它們并不能同時被實現。
這是因為傳統的動畫的導出模式有兩種,即矢量導出和序列幀導出。
矢量導出的動畫文件具有可編輯性,但缺點是一些復雜特效無法在移動端實時預覽,因此無法做到全AE特性支持。
序列幀導出基于截圖的原理解決了這個問題,也就是將復雜的視覺動效全部截成圖片,再實現導出。但這就導致文件大小可能高達幾十上百兆,對移動端而言“又大,又沒法編輯”。
為了讓文件既可以編輯,又能保證精彩動態效果的實現,PAG的研發人員們想到了混合導出的方法。
簡單來說,就是給不需要可編輯性的圖層打標記。這樣在導出時,需要保留編輯性的圖層就會以純矢量形式被導出,而打了標記的圖層,則以序列幀的方式導出。
sdk|王者QQ微信都在用的動畫神器要開源了:把交付時間縮短90%
文章插圖
值得一提的是,為了盡可能壓縮導出文件的大小,PAG團隊還自己設計了bmp預合成的格式,充分利用了視頻的極限幀間壓縮能力,并在此基礎上擴展了對透明通道的支持。
再加上渲染方面的優化,最終,相比于傳統圖片序列幀,視頻序列幀格式的文件大小可以降低到原來的1.24%左右。
sdk|王者QQ微信都在用的動畫神器要開源了:把交付時間縮短90%
文章插圖
但從基礎功能的實現,到如今成為一整套完整的工具流,PAG并非“一蹴而就”。
與之相反,雖然SDK去年才開始對外開放,但早在2016年,PAG的第一行代碼就已經寫下。
從最初的1.0版本迭代到如今的形態,PAG已經走過了4個版本。
“被battle出來的產品”“從寫下第1行代碼,到第1次跑通,團隊就用了6個月時間。”
至于為何要選擇堅持打磨這樣一款工具產品,Dom提到了一個“回憶殺”的詞語Flash:
在Flash時代,動效開發有一套非常完善的工作流:設計師把動畫制作出來,導出一個SWF文件,開發人員無需手敲代碼還原效果,直接導入就能使用。并且動效里面的細節是可以調整的。
但到了現在的H5、移動應用開發里,很少有工具能夠完整還原這套完善的動畫工作流。

相關經驗推薦