提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法
【專利摘要】本發(fā)明提供了一種提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法,該方法通過將SmoothMoves動畫文件掛載的腳本BoneAnimation中的觸發(fā)幀和動畫剪輯數(shù)據(jù)抽離出去并存入一創(chuàng)建的腳本對象中,使得骨骼動畫中觸發(fā)幀和動畫剪輯兩者中不再包含任何數(shù)據(jù),即骨骼動畫中存儲的數(shù)據(jù)量大幅減少。對于同一SmoothMoves動畫文件,不必對大量重復的觸發(fā)幀和動畫剪輯數(shù)據(jù)進行反復的深度復制,只需引用各實例化所創(chuàng)建的腳本對象所共享的同一份數(shù)據(jù)即可,有效地減少了GC Alloc的次數(shù),同時也減少了內(nèi)存占用。
【專利說明】提高Unity3d骨路動畫插件SmoothMoves的加載速度的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種動畫插件加載方法,特別涉及一種提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法。
【背景技術(shù)】
[0002]Unity3d是由來自美國的Unity Technologies公司開發(fā)的在全球占主導地位的一款游戲開發(fā)軟件。Unity是一種開創(chuàng)性的開發(fā)平臺,用于創(chuàng)建游戲和交互式3D和2D體驗,能夠用于三維視頻游戲、建筑可視化、實時三維動畫等類型互動內(nèi)容的設(shè)計。Unity編輯器運行在 Windows 和 Mac OS X 下,并可發(fā)布游戲至 Windows、Mac、Wi1、iPhone、Windowsphone 8和Android眾多平臺,也可以利用Unity web player插件發(fā)布網(wǎng)頁游戲,支持Mac和Windows的網(wǎng)頁瀏覽。正因如此,在智能設(shè)備迅猛發(fā)展的今天,Unity成功占據(jù)了移動游戲開發(fā)引擎的半壁江山。在世界范圍內(nèi),Unity占據(jù)全功能游戲引擎市場45%的份額,大約三倍于其直接競爭對手。
[0003]Unity的最初定位為3d游戲引擎,為3d制作整個流水線提供了全面的支持,同時Unity也支持第三方工具插件,并可以在其官方的Asset Store (資源商店)中發(fā)布和購買,這也是其迅速發(fā)展的重要原因。Unity在游戲制作流程及跨平臺方面的良好表現(xiàn),使得眾多的2d游戲開發(fā)也選擇Unity,同時輔助使用一些第三方的2d插件,在這些工具插件中,SmoothMoves作為一款2d骨骼動畫插件得到了較多關(guān)注。
[0004]SmoothMoves依托于Unity,提供了類似于flash操作方式的2d骨骼動畫解決方案,大大減少2d游戲的資源占用。但是SmoothMoves動畫文件加載時速度較慢,在加載一個含有50個bone,10個clip的動畫文件時,大概需要I秒,如此在加載一個有20個類似動畫文件的場景時便需要20秒左右,即便是將同一個動畫文件實例化20份也要耗費同樣的時長,如此長時間的加載將大大降低游戲者的使用體驗。在通過Unity編輯器中的Profiler (性能分析工具)分析加載過程后,可以發(fā)現(xiàn)在動畫文件加載過程中產(chǎn)生的大量的GC Alloc (會導致垃圾回收的內(nèi)存分配),每個類似前述的動畫產(chǎn)生大約IMB的GCAlloc0正是如此大量的GC Alloc使得加載速度非常之慢。
[0005]現(xiàn)有的SmoothMoves動畫運行時需要依靠腳本BoneAnimat1n(骨骼動畫)來控制,其包含的所有的動畫信息,如關(guān)鍵幀、骨骼貼圖等等。在加載動畫時,需要對BoneAnimat1n進行實例化,而在實例化SmoothMoves動畫時會對這些動畫信息進行復制,即將在內(nèi)存中開放一個空間來存儲動畫對象,因而復制動畫文件時會觸發(fā)GC Alloc。而在實例化多個動畫文件時,將反復復制這些動畫信息,如此反復觸發(fā)GC Alloc,將導致產(chǎn)生大量的垃圾內(nèi)存分配,占用了更多的內(nèi)存空間,拖慢動畫加載速度。
【發(fā)明內(nèi)容】
[0006]本發(fā)明的目的在于提供一種提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法,以解決現(xiàn)有的Unity3d骨骼動畫插件SmoothMoves加載速度較慢的問題。
[0007]本發(fā)明的第二目的在于提供一種提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法,以解決骨骼動畫實例化過程中復制的數(shù)據(jù)量較大的問題。
[0008]為實現(xiàn)上述目的,本發(fā)明提供了一種提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法,包括:
51:從動畫文件的骨骼動畫中抽離出觸發(fā)幀和動畫剪輯,并分別形成觸發(fā)幀列表和動畫剪輯列表;
52:每次實例化一個骨骼動畫時,通過添加引用的方式對所述觸發(fā)幀列表和動畫剪輯列表進行單獨加載。
[0009]較佳地,所述步驟SI具體包括以下步驟:
511:創(chuàng)建骨骼動畫的腳本對象;
512:在所述腳本對象中創(chuàng)建觸發(fā)幀列表及動畫剪輯列表;
513:將原有的骨骼動畫的觸發(fā)幀拷貝到所述觸發(fā)幀列表中,并清空原有骨骼動畫的觸發(fā)幀;
S14:將原有的骨骼動畫的動畫剪輯拷貝到所述動畫剪輯列表中,并清空原有骨骼動畫的動畫剪輯。
[0010]較佳地,所述步驟S13還包括對骨骼動畫的觸發(fā)幀進行優(yōu)化,所述對骨骼動畫的觸發(fā)幀進行優(yōu)化具體包括以下步驟:
5131:建立觸發(fā)幀骨骼集合,所述觸發(fā)幀骨骼集合包含屬性不同的若干觸發(fā)幀骨骼;
5132:建立骨骼動畫觸發(fā)幀數(shù)組,所述骨骼動畫觸發(fā)幀數(shù)組包括若干觸發(fā)幀,每個觸發(fā)幀包括若干觸發(fā)幀骨骼;
5133:對每個觸發(fā)幀均建立一對應的索引表,該索引表中存儲其對應的觸發(fā)幀中的所有觸發(fā)幀骨骼在所述觸發(fā)幀骨骼集合的索引,在對每個觸發(fā)幀建立對應的索引表后,清除該觸發(fā)幀的全部觸發(fā)幀骨骼;
5134:將骨骼動畫的各觸發(fā)幀的索引表拷貝到所述觸發(fā)幀列表中各觸發(fā)幀對應位置處,并清空所述觸發(fā)幀列表中的觸發(fā)幀。
[0011 ] 較佳地,所述步驟S2具體包括:
521:預先加載包含所述觸發(fā)幀列表及動畫剪輯列表的腳本對象;
522:實例化所述骨骼動畫并為其觸發(fā)幀和動畫剪輯添加引用。
[0012]較佳地,所述步驟S22具體包括:
將骨骼動畫中的觸發(fā)幀指向腳本對象中的觸發(fā)幀列表;
將骨骼動畫中的動畫剪輯指向腳本對象中的動畫剪輯列表。
[0013]較佳地,所述步驟Sll中的所述腳本對象為一待填充數(shù)據(jù)的空表。
[0014]本發(fā)明所提供的方法通過將SmoothMoves動畫文件掛載的腳本BoneAnimat1n(骨骼動畫)中的觸發(fā)幀和動畫剪輯數(shù)據(jù)抽離出去并存入一腳本對象中,使得骨骼動畫中觸發(fā)幀和動畫剪輯兩者中不再包含任何數(shù)據(jù),即骨骼動畫中存儲的數(shù)據(jù)量大幅減少。在動畫實例化時,在對骨骼動畫進行深度復制時,即不必再調(diào)取骨骼動畫中的觸發(fā)幀和動畫剪輯數(shù)據(jù),而是通過引用腳本對象的方式實現(xiàn)對原來的觸發(fā)幀和動畫剪輯數(shù)據(jù)的加載。進一步地通過將原本存儲于觸發(fā)幀中的各個觸發(fā)幀骨骼數(shù)據(jù)存儲在一建立的屬性無重合的觸發(fā)幀骨骼集合中,而觸發(fā)幀中只存儲其原來所存儲的觸發(fā)幀骨骼的索引表,再將各觸發(fā)幀對應的索引表存儲在腳本對象的觸發(fā)幀列表中,這種方式進一步地減少了在骨骼動畫進行深度復制時對大量重復的數(shù)據(jù)的復制量。
[0015]采用本發(fā)明方法后,對于同一 SmoothMoves動畫文件,不必對大量重復的觸發(fā)幀和動畫剪輯數(shù)據(jù)進行反復的深度復制,只需引用各實例化腳本對象所共享的同一份數(shù)據(jù)即可,有效地減少了 GC Alloc的次數(shù),同時也減少了內(nèi)存占用。
【專利附圖】
【附圖說明】
[0016]圖1為本發(fā)明方法優(yōu)選實施例的整體步驟流程圖;
圖2為本發(fā)明方法優(yōu)選實施例的步驟SI的具體步驟流程圖;
圖3為本發(fā)明方法優(yōu)選實施例的步驟SI的具體執(zhí)行過程流程圖;
圖4為本發(fā)明方法優(yōu)選實施例的步驟S2的具體步驟流程圖;
圖5為本發(fā)明方法一實施例的優(yōu)化前及優(yōu)化后數(shù)據(jù)量對比示意圖;
圖6為優(yōu)選實施例的對骨骼動畫的觸發(fā)幀進行優(yōu)化的具體步驟流程圖。
【具體實施方式】
[0017]為更好地說明本發(fā)明,茲以若干優(yōu)選實施例,并配合附圖對本發(fā)明作詳細說明,具體如下:
如圖1所示,本發(fā)明方法包括兩步,具體如下:
步驟S1:從動畫文件的骨骼動畫中抽離出觸發(fā)幀和動畫剪輯,并分別形成觸發(fā)幀列表和動畫剪輯列表;
步驟S2:每次實例化一個骨骼動畫時,先對所述觸發(fā)幀列表和動畫剪輯列表進行單獨加載,再為骨骼動畫添加相應引用。
[0018]其中,步驟SI具體包括4個步驟,如圖2所示,現(xiàn)結(jié)合圖3具體說明步驟SI的執(zhí)行過程,具體如下:
對于一個SmoothMoves動畫animat1nT,其骨豁動畫的觸發(fā)巾貞(BoneAnimat1n.triggerFrames)的大小為200K字節(jié),骨豁動畫的動畫剪輯(BoneAnimat1n.mAnimat1nClips)大小為 10K 字節(jié)。
[0019]Sll:創(chuàng)建骨骼動畫的腳本對象。
[0020]具體為,創(chuàng)建腳本對象(ScriptObject)實例,該腳本對象命名為SMAnimat1nData(如圖3所示),其中,SMAnimat1nData為一待填充數(shù)據(jù)的空表。
[0021]S12:在腳本對象中創(chuàng)建觸發(fā)幀列表及動畫剪輯列表。
[0022]具體為,在SMAnimat1nData中添加觸發(fā)巾貞(TriggerFrame)數(shù)組的成員觸發(fā)巾貞列表(triggerFrames)。
[0023]同時在SMAnimat1nData中添加輕量化動畫剪輯(Animat1nClipSM_Lite)數(shù)組的成員動畫剪輯列表(mAnimat1nClips)。
[0024]S13:將原有的骨骼動畫的觸發(fā)幀拷貝到所述觸發(fā)幀列表中,并清空原有的骨骼動畫觸發(fā)幀。
[0025]將骨骼動畫的觸發(fā)巾貞(BoneAnimat1n.triggerFrames)拷貝到腳本對象的觸發(fā)中貞列表(SMAnimat1nData.triggerFrames)中,并清空 BoneAnimat1n.triggerFrames。
[0026]S14:將原有的骨骼動畫的動畫剪輯拷貝到所述動畫剪輯列表中,并清空原有的骨骼動畫的動畫剪輯。
[0027]將骨豁動畫的動畫剪輯(BoneAnimat1n.mAnimat1nClips)拷貝到腳本對象的動畫剪輯列表(SMAnimat1nData.mAnimat1nClips)中,并清空 BoneAnimat1n.mAnimat1nClips。
[0028]在經(jīng)過步驟SI處理后,得到腳本對象scriptDataT,其中包含了原動畫BoneAnimat1n.triggerFrames 和 BoneAnimat1n.mAnimat1nClips,各自大小依舊為200K和10K字節(jié)。
[0029]執(zhí)行完上述SI的各步驟后,采用實例化的方式對Unity3d骨骼動畫插件SmoothMoves進行加載,即執(zhí)行步驟S2,如圖4所示,步驟S2具體包括兩步,具體如下:
S21:預先加載所述的包含觸發(fā)幀列表和動畫剪輯列表的腳本對象;
如S13和S14步驟中所述,經(jīng)前述步驟處理后,骨骼動畫中的觸發(fā)巾貞(BoneAnimat1n.triggerFrames)和動畫剪輯(BoneAnimat1n.mAnimat1nClips)已經(jīng)為空,不再占有大量內(nèi)存空間。
[0030]而這些數(shù)據(jù)已被存儲到了腳本對象中,因此在實例化任一骨骼動畫之前,需要預先加載該骨骼動畫對應的腳本對象,以供實例化時獲取相應的觸發(fā)幀及動畫剪輯信息。
[0031]腳本對象的加載方式無需做任何特殊處理,與現(xiàn)有的骨骼動畫本身的加載方式相同。
[0032]S22:實例化骨骼動畫并為其觸發(fā)幀和動畫剪輯添加引用。
[0033]骨骼動畫本身因為已經(jīng)清空了觸發(fā)幀和動畫剪輯兩大塊數(shù)據(jù),可以相對較快的完成實例化。
[0034]實例化之后的骨骼動畫因為觸發(fā)幀和動畫剪輯被清空,無法完成其現(xiàn)有的工作。此時便需要通過預先加載的腳本對象,為骨骼動畫添加相關(guān)引用,具體為:
I將骨骼動畫中的觸發(fā)巾貞(BoneAnimat1n.triggerFrames)指向腳本對象中的觸發(fā)中貞列表(SMAnimat1nData.triggerFrames)。
[0035]I將骨豁動畫中的動畫剪輯(BoneAnimat1n.mAnimat1nClips)指向腳本對象中的動畫剪輯列表(SMAnimat1nData.mAnimat1nClips)。
[0036]經(jīng)上述操作后,當游戲場景中要同時出現(xiàn)20個animat1nT動畫時,貝U在使用本發(fā)明的方法之前,就會產(chǎn)生20個骨骼動畫(BoneAnimat1n),相應的觸發(fā)巾貞(triggerFrames)就有20份,總大小為4000K字節(jié),動畫剪輯(mAnimat1nClips)也有20份,總大小為2000K字節(jié)。而使用該發(fā)明的方法之后,僅存儲一個腳本對象scriptDataT。20個animat1nT動畫依舊對應 20 個 BoneAnimat1n,但其 triggerFrames 和 mAnimat1nClips 均指向腳本對象的觸發(fā)巾貞列表(scriptDataT.triggerFrames)和腳本對象的動畫剪輯列表(scriptData.mAnimat1nClips),而不是20份彼此獨立的拷貝。即20個動畫文件,僅有一份triggerFrames和mAnimat1nClips數(shù)據(jù),大小依舊分別為200K和100K字節(jié),如圖5所
/Jn ο
[0037]實施例二:
本實施例除以下部分與實施例一不同外,其他部分均與實施例一相同:具體如下: 步驟313的拷貝后,還可根據(jù)需要對骨骼動畫的觸發(fā)幀進行進一步的優(yōu)化,如圖6所示,這種對骨骼動畫的觸發(fā)幀進行優(yōu)化具體包括以下步驟:
8131:建立觸發(fā)巾貞骨骼集合(廿狀一沖!'孤1680116361:),該觸發(fā)巾貞骨骼集合中包含屬性不同的若干觸發(fā)巾貞骨骼()。
[0038]3132:建立骨骼動畫觸發(fā)巾貞數(shù)組(80116八廿886沖1'肅68),骨骼動畫觸發(fā)中貞數(shù)組中包含若干個觸發(fā)巾貞'孤16〉,觸發(fā)巾貞是以動畫剪輯的索引((311? 和幀(色^腕)為鍵值,且每個觸發(fā)幀中存儲了相應的動畫剪輯的相應幀上的所有骨骼關(guān)鍵幀信息,即觸發(fā)巾貞骨骼列表1:1-^^61-^81116801168),該列表包括若干觸發(fā)巾貞骨骨各(丁'部11680116 )。
[0039]8133:對每個觸發(fā)幀均建立一對應的索引表,該索引表中存儲其對應的觸發(fā)幀中的所有觸發(fā)幀骨骼在上述觸發(fā)幀骨骼集合的索引。該過程具體為:選取骨骼動畫觸發(fā)幀數(shù)組(80116八II 1111211:1011.廿狀虹辦肅⑶)中的一個觸發(fā)巾貞(即元素忖),為1:?建立觸發(fā)巾貞骨骼索引表'孤1680116111(16^68),即分別為1:?內(nèi)的全部的觸發(fā)巾貞骨骼建立索引,每個觸發(fā)幀骨骼的索引對應于上述觸發(fā)幀骨骼集合中的一個屬性相同的觸發(fā)幀骨骼。
[0040]在對每個觸發(fā)幀均建立對應的索引表后,清除該觸發(fā)幀的全部觸發(fā)幀骨骼。
[0041]8134:將骨骼動畫的各觸發(fā)幀的索引表拷貝到觸發(fā)幀列表中各觸發(fā)幀對應位置處,并清空觸發(fā)幀列表中的觸發(fā)幀。
[0042]當對骨骼動畫的觸發(fā)幀進行進一步的優(yōu)化后,骨骼動畫觸發(fā)幀的數(shù)據(jù)量將更少,在此不再贅述。
[0043]上述實例化骨骼動畫過程當中,無需深度復制骨骼動畫的觸發(fā)幀和動畫剪輯,而是僅將骨骼動畫的引用指向抽離出的觸發(fā)幀列表和動畫剪輯列表即可,即當對同一個動畫文件進行多次復制時,僅需引用該骨骼動畫所對應的同一份觸發(fā)幀列表和動畫剪輯列表,有效地減少了實例化過程中骨骼動畫復制的數(shù)據(jù)量。
[0044]以上所述,僅為本發(fā)明的【具體實施方式】,但本發(fā)明的保護范圍并不局限于此,任何本領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),對本發(fā)明所做的變形或替換,都應涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應以所述的權(quán)利要求的保護范圍為準。
【權(quán)利要求】
1.一種提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法,其特征在于,包括: 51:從動畫文件的骨骼動畫中抽離出觸發(fā)幀和動畫剪輯,并分別形成觸發(fā)幀列表和動畫剪輯列表; 52:每次實例化一個骨骼動畫時,先對所述觸發(fā)幀列表和動畫剪輯列表進行單獨加載,再為骨骼動畫添加相應引用。
2.根據(jù)權(quán)利要求1所述的提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法,其特征在于,所述步驟SI具體包括以下步驟: 511:創(chuàng)建骨骼動畫的腳本對象; 512:在所述腳本對象中創(chuàng)建觸發(fā)幀列表及動畫剪輯列表; 513:將原有的骨骼動畫的觸發(fā)幀拷貝到所述觸發(fā)幀列表中,并清空原有骨骼動畫的觸發(fā)幀; S14:將原有的骨骼動畫的動畫剪輯拷貝到所述動畫剪輯列表中,并清空原有骨骼動畫的動畫剪輯。
3.根據(jù)權(quán)利要求2所述的提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法,其特征在于,所述步驟S13還包括對骨骼動畫的觸發(fā)幀進行優(yōu)化,所述對骨骼動畫的觸發(fā)幀進行優(yōu)化具體包括以下步驟: 5131:建立觸發(fā)幀骨骼集合,所述觸發(fā)幀骨骼集合包含屬性不同的若干觸發(fā)幀骨骼; 5132:建立骨骼動畫觸發(fā)幀數(shù)組,所述骨骼動畫觸發(fā)幀數(shù)組包括若干觸發(fā)幀,每個觸發(fā)幀包括若干觸發(fā)幀骨骼; 5133:對每個觸發(fā)幀均建立一對應的索引表,該索引表中存儲其對應的觸發(fā)幀中的所有觸發(fā)幀骨骼在所述觸發(fā)幀骨骼集合的索引,在對每個觸發(fā)幀建立對應的索引表后,清除該觸發(fā)幀的全部觸發(fā)幀骨骼; S13 4:將骨骼動畫的各觸發(fā)幀的索引表拷貝到所述觸發(fā)幀列表中各觸發(fā)幀對應位置處,并清空所述觸發(fā)幀列表中的觸發(fā)幀。
4.根據(jù)權(quán)利要求1或2或3所述的提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法,其特征在于,所述步驟S2具體包括: 521:預先加載包含所述觸發(fā)幀列表及動畫剪輯列表的腳本對象; 522:實例化所述骨骼動畫并為其觸發(fā)幀和動畫剪輯添加引用。
5.根據(jù)權(quán)利要求4所述的提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法,其特征在于,所述步驟S22具體包括: 將骨骼動畫中的觸發(fā)幀指向腳本對象中的觸發(fā)幀列表; 將骨骼動畫中的動畫剪輯指向腳本對象中的動畫剪輯列表。
6.根據(jù)權(quán)利要求2所述的提高Unity3d骨骼動畫插件SmoothMoves的加載速度的方法,其特征在于,所述步驟Sll中的所述腳本對象為一待填充數(shù)據(jù)的空表。
【文檔編號】G06T13/20GK104503795SQ201410819092
【公開日】2015年4月8日 申請日期:2014年12月25日 優(yōu)先權(quán)日:2014年12月25日
【發(fā)明者】曹青 申請人:上海愷英網(wǎng)絡(luò)科技有限公司