背景
Spine是一種骨骼動畫工具,我們游戲中的人物、光效等動畫資源,基本上都是用它做的。
Spine官方主頁:http://zh.esotericsoftware.com/
Spine做出來的動畫最終會導出三個文件,分別為:.atlas,.json,.png。
atlas文件和png文件記錄合圖前的所有被切割的圖片信息,而json文件記錄的是骨骼配置和動畫信息,也就是Spine動畫最關鍵的數據。
為了能讓導出的文件在不同的引擎中運行,需要針對不同的引擎寫對應的播放代碼。這些代碼在https://github.com/EsotericSoftware/spine-runtimes中可以找到。
我們的游戲引擎是cocos2dx,里面已經集成了一個Spine動畫的播放代碼。不一定是最新的,有必要時可以到上面的gitbug中去下載最新的。
問題
背景已經講完,看看在游戲中使用Spine時遇到什么問題。
問題1、加載多個Spine動畫時會比較卡。
原因:加載Spine動畫時,需要加載上面提到的三個文件,並且讀取json文件里面的動畫信息,轉換成內存對象,整個過程是阻塞的。當加載多個Spine文件后,造成阻塞的時間比較長,所以就會有卡頓出現了。
問題2、同樣的Spine動畫加載多個,內存上升明顯。
原因:Spine動畫數據沒有重用,同一個動畫加載多個到場景中時,會加載多次,數據也成倍增加。既浪費內存又增加加載卡頓的時間。
針對第一個問題,有一種解決方案,就是避免同一個時間加載過多的Spine動畫,可以采用每一段時間加載一個,這樣可以分攤加載壓力,不至於瞬間卡死程序。這種方法可以緩解,但沒有根除。
但不能解決第二個問題。所以得想一種能解決這兩種問題的方案。
解決方案
針對問題1,可以采用異步加載的方式,也就是加載過程不要阻塞主線程(渲染線程),開一個線程來加載,加載完成后把數據給主線程,讓其渲染。這樣可以避免卡頓。
針對問題2,需要一個池子保存加載過的動畫數據,當遇到重復的Spine動畫時,直接把上次加載的數據返回即可,這樣既避免了內存暴漲,又避免了多余的加載過程。
實現
新建SpineCache類,專門用來開線程加載數據和緩存數據。具體實現可以直接到VS里面去看了。純代碼的東西還真不知道怎么描述。。。
注意事項
1、記得手動清除SpineCache里面緩存的數據,我們目前是在切換場景時調用clearAllCache接口。當然特殊時候也可以手動移除指定的緩存。
2、Spine運行時代碼的更新,這個比較蛋疼,如果更新了Spine 的運行時代碼,需要把修改的SpineCache代碼功能加進去。