本發(fā)明涉及視頻處理領域,更具體地,涉及一種幀動畫加載加速方法以及一種幀動畫加載加速裝置。
背景技術:
在時間幀上逐幀繪制幀內(nèi)容稱為序列幀動畫,簡稱幀動畫。由于是一幀一幀的畫,所以幀動畫具有非常大的靈活性,幾乎可以表現(xiàn)任何想表現(xiàn)的內(nèi)容。
由于幀動畫的特性,幀動畫在執(zhí)行前,需要先把幀動畫里所有指定的圖片文件一張一張加載到內(nèi)存里。以這種方式進行加載,如果幀動畫里指定的圖片過多,需要逐幀進行加載,則會造成很長時間的延遲。另外,如果圖片過大,載入內(nèi)存中的超大圖片也會造成內(nèi)存溢出。因此,有必要開發(fā)一種能夠?qū)崿F(xiàn)幀動畫加載加速方法及裝置。
公開于本發(fā)明背景技術部分的信息僅僅旨在加深對本發(fā)明的一般背景技術的理解,而不應當被視為承認或以任何形式暗示該信息構成已為本領域技術人員所公知的現(xiàn)有技術。
技術實現(xiàn)要素:
為了解決現(xiàn)有技術中存在的上述問題,本發(fā)明提出了一種幀動畫加載加速方法及裝置。
根據(jù)本發(fā)明的一方面,提出一種幀動畫加載加速方法。該方法包括:
通過編輯工具將原始幀動畫中所有幀圖片合成至少一張合成圖,并導出所有幀圖片在合成圖中的圖片信息文件;
在Natvie端基于合成圖的數(shù)目創(chuàng)建對應數(shù)量的線程,并將各張合成圖在對應的線程中加載到內(nèi)存中;
讀取圖片信息文件,基于所讀取的信息,按照所述原始幀動畫中所有幀圖片的順序,將加載到內(nèi)存中的各張合成圖中的每幀圖片與內(nèi)存中的位置一一關聯(lián);
在Java端新建幀動畫實例,根據(jù)每幀圖片所關聯(lián)的內(nèi)存中的位置將每幀圖片的數(shù)據(jù)加入到所述幀動畫實例中;
將所述幀動畫實例進行動畫的播放。
優(yōu)選地,所述圖片信息文件的信息包括每幀圖片在合成圖中的位置和尺寸,用于將每張幀圖片在所述合成圖中進行索引。
優(yōu)選地,所述將原始幀動畫中所有幀圖片合成至少一張合成圖時,分組將各幀圖片分別進行合成,使各張合成圖之間的尺寸差小于預定值。
優(yōu)選地,所述將各張合成圖在對應的線程中加載到內(nèi)存時,所述合成圖以字節(jié)數(shù)組的形式進行存儲。
根據(jù)本發(fā)明的另一方面,提出一種幀動畫加載加速裝置。該裝置包括:
預處理單元,通過編輯工具將幀動畫中所有幀圖片合成至少一張合成圖,并導出所有幀圖片在合成圖中的圖片信息文件;
加載單元,在Natvie端基于合成圖的數(shù)目創(chuàng)建對應數(shù)量的線程,并將各張合成圖在對應的線程中加載到內(nèi)存中;
關聯(lián)單元,讀取圖片信息文件,基于所讀取的信息,按照所述原始幀動畫中所有幀圖片的順序,將加載到內(nèi)存中的各張合成圖中的每幀圖片與內(nèi)存中的位置一一關聯(lián);
實例創(chuàng)建單元,在Java端新建幀動畫實例,根據(jù)每幀圖片所關聯(lián)的內(nèi)存中的位置將每幀圖片的數(shù)據(jù)加入到所述幀動畫實例中;
播放單元,將所述幀動畫實例進行動畫的播放。
優(yōu)選地,所述圖片信息文件的信息包括每幀圖片在合成圖中的位置和尺寸,用于將每張幀圖片在所述合成圖中進行索引。
優(yōu)選地,所述將原始幀動畫中所有幀圖片合成至少一張合成圖時,分組將各幀圖片分別進行合成,使各張合成圖之間的尺寸差小于預定值。
優(yōu)選地,所述將各張合成圖在對應的線程中加載到內(nèi)存時,所述合成圖以字節(jié)數(shù)組的形式進行存儲。
本發(fā)明通過對原始幀動畫中所有圖片進行合成的預處理方式,并采用多線程加載實現(xiàn)對幀動畫圖片的加速加載,從而大幅度縮短幀動畫的準備時間;同時由于在Native端實現(xiàn)圖片加載過程,減小圖片加載過程中內(nèi)存溢出的風險。
本發(fā)明的方法具有其它的特性和優(yōu)點,這些特性和優(yōu)點從并入本文中的附圖和隨后的具體實施例中將是顯而易見的,或者將在并入本文中的附圖和隨后的具體實施例中進行詳細陳述,這些附圖和具體實施例共同用于解釋本發(fā)明的特定原理。
附圖說明
通過結合附圖對本發(fā)明示例性實施例進行更詳細的描述,本發(fā)明的上述以及其它目的、特征和優(yōu)勢將變得更加明顯,其中,在本發(fā)明示例性實施例中,相同的參考標號通常代表相同部件。
圖1示出了根據(jù)本發(fā)明的一個實施例的幀動畫加載加速方法的流程圖。
圖2a-圖2l分別示出了根據(jù)本發(fā)明的一個實施例的幀動畫中包含的12張幀圖片。
圖3a-圖3c分別為根據(jù)本發(fā)明的一個實施例的基于圖2a-圖2l合成的三張合成圖。
具體實施方式
下面將參照附圖更詳細地描述本發(fā)明。雖然附圖中顯示了本發(fā)明的優(yōu)選實施例,然而應該理解,可以以各種形式實現(xiàn)本發(fā)明而不應被這里闡述的實施例所限制。
圖1示出了根據(jù)本發(fā)明的一個實施例的幀動畫加載加速方法的流程圖。
在該實施例中,幀動畫加載加速方法包括以下步驟:
(1)通過編輯工具將幀動畫中所有幀圖片合成至少一張合成圖,并導出所有幀圖片在合成圖中的圖片信息文件。
對于具有多圖片幀的幀動畫,為了減少讀取圖片的次數(shù),首先對所有幀圖片進行預處理。之所以需要減少圖片的數(shù)量,是為了減少軟件實現(xiàn)中圖片加載的上下文切換的次數(shù)。
本實施例中,將幀動畫中的所有幀圖片進行預處理,形成合成圖和對應的圖片信息文件后,上傳至服務器端,再在后續(xù)步驟中由終端創(chuàng)建線程后進行加載。
所述預處理即通過編輯工具將一定數(shù)目的幀圖片進行拼接形成一張合成圖,從而將幀動畫中的所有幀圖片合成至少一張合成圖。
線程并發(fā)(即多線程)可以同時處理多個任務,即線程越多,能同時處理的任務越多,在本實施例中即能同時讀取的圖片越多。但是線程越多,也同時會導致并發(fā)能力下降,從而出現(xiàn)每個線程獲取不到足夠的運行時間,因而發(fā)生阻塞,得不償失。因而,要將合成圖的數(shù)目限制為合理數(shù)目。這個合理數(shù)目出于軟件實現(xiàn)中線程數(shù)量和性能平衡上的考慮而被限制為不多于3張。
在示例性實施例中,所述將原始幀動畫中所有幀圖片合成至少一張合成圖時,分組將各幀圖片分別進行合成,使各張合成圖之間的尺寸差小于預定值。
出于線程并發(fā)效率的考慮,圖片拼接時應該盡量保證所拼接形成的圖片尺寸的均衡,即保證各張合成圖之間的尺寸小于預定值。該預定值可以根據(jù)實際需要而確定。比如目標數(shù)量是3張,那么應盡量保證這三張圖片的尺寸是接近一致的,避免出現(xiàn)圖片之間的尺寸差距特別大的情況。圖片的拼接過程中,應當記錄每個圖片幀在合成圖中的信息。
在示例性實施例中,編輯工具是TexturePacker。
在示例性實施例中,圖片信息文件的信息包括每個圖片幀在合成圖中的位置和尺寸,用于將每張幀圖片在所述合成圖中進行索引。每個圖片幀在合成圖中的尺寸以像素為單位,位置坐標也以像素為單位。
在示例性實施例中,圖片信息文件為xml文件。
以下為兩幀圖片在合成圖中的圖片信息文件的示例:
以上參數(shù)表明合成的合成圖中有兩幀圖片,分別為pic1.png和pic2.png,其中pic1.png的尺寸是1280*800,在合成圖中的位置為左上坐標為(1,1),右下坐標為(1280,800)的矩形區(qū)域;pic2.png的尺寸是1280*800,在合成圖中的位置為左上坐標為(1,803),右下坐標為(1280,800)的矩形區(qū)域。
(2)在Natvie端基于合成圖的數(shù)目創(chuàng)建對應數(shù)量的線程,并將各張合成圖在對應的線程中加載到內(nèi)存中。
在預處理完成之后是軟件的實現(xiàn),分別在Java端和Native端進行,可以以C/C++實現(xiàn)。
在預處理階段合成了至少一張合成圖,在軟件實現(xiàn)階段則在Native端創(chuàng)建相同數(shù)量的線程,并同時在各個線程中對相應的合成圖進行讀取操作以將其加載到內(nèi)存中。
獲取圖片信息、創(chuàng)建數(shù)據(jù)流、將數(shù)據(jù)以字節(jié)形式讀到內(nèi)存、關閉數(shù)據(jù)流,這整個讀取流程是有過程消耗的,即如果要加載的圖片過多,很多的時間都消耗在數(shù)據(jù)流讀取的準備和結束階段,實際進行讀寫的時間并不長。而通過合成有限數(shù)目的合成圖,減少了圖片數(shù)量,從而壓縮了讀取準備階段的時間。
在Native端實現(xiàn)圖片加載過程,由于Native代碼在原生空間執(zhí)行,并不占用Java端虛擬機內(nèi)存,沒有內(nèi)存使用的限制,不會輕易出現(xiàn)內(nèi)存益處的風險。
在示例性實施例中,所述將各張合成圖在對應的線程中加載到內(nèi)存時,所述合成圖以字節(jié)數(shù)組的形式進行存儲。優(yōu)選地,合成圖的每個像素點使用4個字節(jié)表示。
例如,在上述示例圖片信息文件中,pic1.png在字節(jié)數(shù)組中的數(shù)據(jù)就是左上(1,1)和右下(1280*4,800*4)的數(shù)組區(qū)域。
(3)讀取圖片信息文件,基于所讀取的信息,按照所述原始幀動畫中所有幀圖片的順序?qū)⒓虞d到內(nèi)存中的各張合成圖中的每幀圖片與內(nèi)存中的位置一一關聯(lián)。
在各個線程中加載的合成圖在內(nèi)存中的位置是隨機的,如果直接讀取每個合成圖中的幀圖片,那么其在順序上與原始動畫中所有幀圖片的順序未必是一致的,因此需要將已經(jīng)加載到內(nèi)存中的各個合成圖中的每幀圖片與內(nèi)存中的位置一一關聯(lián)。每張所關聯(lián)的內(nèi)存中的位置順序與原始動畫中所有幀圖片的排列順序是一致的,即實現(xiàn)了合成圖中每幀圖片在內(nèi)存中的位置的還原,按該排列順序?qū)崿F(xiàn)后續(xù)每幀圖像的顯示。
(4)在Java端新建幀動畫實例,根據(jù)每幀圖片所關聯(lián)的內(nèi)存中的位置將每幀圖片的數(shù)據(jù)加入到所述幀動畫實例中。
在Java端新建幀動畫實例,所新建的幀動畫實例例如為AnimationDrawable,AnimationDrawable是實現(xiàn)幀動畫的基本類,用于管理幀動畫中的各個幀。在還原了合成圖中每幀圖片在內(nèi)存中的位置后,根據(jù)每幀圖片所關聯(lián)的內(nèi)存中的位置將每幀圖片的數(shù)據(jù)加入到所述幀動畫實例中。
(5)將所述幀動畫實例傳遞給終端設備中,當前顯示在屏幕的視圖類以進行動畫的播放。
顯示在屏幕的視圖類為View,調(diào)用幀動畫實例的start()方法即可實現(xiàn)動畫的播放。
根據(jù)本發(fā)明的另一實施例,提供了一種幀動畫加載加速裝置。
該裝置可以包括:
預處理單元,通過編輯工具將幀動畫中所有幀圖片合成至少一張合成圖,并導出所有幀圖片在合成圖中的圖片信息文件;
加載單元,在Natvie端基于合成圖的數(shù)目創(chuàng)建對應數(shù)量的線程,并將各張合成圖在對應的線程中加載到內(nèi)存中;
關聯(lián)單元,讀取圖片信息文件,基于所讀取的信息,按照所述原始幀動畫中所有幀圖片的順序,將加載到內(nèi)存中的各張合成圖中的每幀圖片與內(nèi)存中的位置一一關聯(lián);
實例創(chuàng)建單元,在Java端新建幀動畫實例,根據(jù)每幀圖片所關聯(lián)的內(nèi)存中的位置將每幀圖片的數(shù)據(jù)加入到所述幀動畫實例中;
播放單元,將所述幀動畫實例進行動畫的播放。
在一個示例中,所述圖片信息文件的信息包括每幀圖片在合成圖中的位置和尺寸,用于將每張幀圖片在所述合成圖中進行索引。
在一個示例中,所述將原始幀動畫中所有幀圖片合成至少一張合成圖時,分組將各幀圖片分別進行合成,使各張合成圖之間的尺寸差小于預定值。
在一個示例中,所述將各張合成圖在對應的線程中加載到內(nèi)存時,所述合成圖以字節(jié)數(shù)組的形式進行存儲。
應用示例
為便于理解本發(fā)明實施例的方案及其效果,以下給出一個具體應用示例。本領域技術人員應理解,該示例僅為了便于理解本發(fā)明,其任何具體細節(jié)并非意在以任何方式限制本發(fā)明。
圖2a-圖2l示出了12張幀圖片,依次為pic1,pic2,pic3,pic4,pic5,pic6,pic7,pic8,pic9,pic10,pic11,pic12。
通過以下步驟對由這12張幀圖片構成的幀動畫進行加載加速處理。
步驟1:對圖片進行預處理,即將如圖2a-圖2l所示的12張幀圖片pic1-pic12合成三張合成圖,每張合成圖包含4張幀圖片。如圖3a-圖3c所示,合成圖1包括pic1-pic4,合成圖2包括pic5-pic8,合成圖3包括pic9-pic12。并且導出這三張合成圖的圖片文件信息;預處理完畢后上傳至服務器端供終端進行下載。
合成圖1、2、3的圖片信息如下:
合成圖1:
合成圖2:
合成圖3:
步驟2:在手機端下載合成圖1、2、3,并在Native端創(chuàng)建3個線程,分別在對應的線程中將合成圖1、2、3加載到內(nèi)存中;
步驟3:讀取圖片信息文件,基于所讀取的信息,按照原始幀動畫中所有幀圖片的順序?qū)⒓虞d到內(nèi)存中的各張合成圖中的每幀圖片與內(nèi)存中的位置一一關聯(lián),包括坐標和尺寸上的對應;
步驟4:新建幀動畫實例AnimationDrawable,根據(jù)每幀圖片所關聯(lián)的內(nèi)存中的位置將每幀圖片的數(shù)據(jù)加入到所述幀動畫實例中;
步驟5:將該實例傳遞給當前顯示在屏幕的視圖類View,通過調(diào)用幀動畫實例的start()來播放動畫,使幀動畫在手機屏幕上顯示。
本領域技術人員應理解,上面對本發(fā)明的實施例的描述的目的僅為了示例性地說明本發(fā)明的實施例的有益效果,并不意在將本發(fā)明的實施例限制于所給出的任何示例。
本發(fā)明可以是裝置、方法和/或計算機程序產(chǎn)品。計算機程序產(chǎn)品可以包括計算機可讀存儲介質(zhì),其上載有用于使處理器實現(xiàn)本發(fā)明的各個方面的計算機可讀程序指令。
計算機可讀存儲介質(zhì)可以是可以保持和存儲由指令執(zhí)行設備使用的指令的有形設備。計算機可讀存儲介質(zhì)例如可以是――但不限于――電存儲設備、磁存儲設備、光存儲設備、電磁存儲設備、半導體存儲設備或者上述的任意合適的組合。計算機可讀存儲介質(zhì)的更具體的例子(非窮舉的列表)包括:便攜式計算機盤、硬盤、隨機存取存儲器(RAM)、只讀存儲器(ROM)、可擦式可編程只讀存儲器(EPROM或閃存)、靜態(tài)隨機存取存儲器(SRAM)、便攜式壓縮盤只讀存儲器(CD-ROM)、數(shù)字多功能盤(DVD)、記憶棒、軟盤、機械編碼設備、例如其上存儲有指令的打孔卡或凹槽內(nèi)凸起結構、以及上述的任意合適的組合。這里所使用的計算機可讀存儲介質(zhì)不被解釋為瞬時信號本身,諸如無線電波或者其他自由傳播的電磁波、通過波導或其他傳輸媒介傳播的電磁波(例如,通過光纖電纜的光脈沖)、或者通過電線傳輸?shù)碾娦盘枴?/p>
這里所描述的計算機可讀程序指令可以從計算機可讀存儲介質(zhì)下載到各個計算/處理設備,或者通過網(wǎng)絡、例如因特網(wǎng)、局域網(wǎng)、廣域網(wǎng)和/或無線網(wǎng)下載到外部計算機或外部存儲設備。網(wǎng)絡可以包括銅傳輸電纜、光纖傳輸、無線傳輸、路由器、防火墻、交換機、網(wǎng)關計算機和/或邊緣服務器。每個計算/處理設備中的網(wǎng)絡適配卡或者網(wǎng)絡接口從網(wǎng)絡接收計算機可讀程序指令,并轉(zhuǎn)發(fā)該計算機可讀程序指令,以供存儲在各個計算/處理設備中的計算機可讀存儲介質(zhì)中。
用于執(zhí)行本發(fā)明操作的計算機程序指令可以是匯編指令、指令集架構(ISA)指令、機器指令、機器相關指令、微代碼、固件指令、狀態(tài)設置數(shù)據(jù)、或者以一種或多種編程語言的任意組合編寫的源代碼或目標代碼,所述編程語言包括面向?qū)ο蟮木幊陶Z言—諸如Smalltalk、C++等,以及常規(guī)的過程式編程語言—諸如“C”語言或類似的編程語言。計算機可讀程序指令可以完全地在用戶計算機上執(zhí)行、部分地在用戶計算機上執(zhí)行、作為一個獨立的軟件包執(zhí)行、部分在用戶計算機上部分在遠程計算機上執(zhí)行、或者完全在遠程計算機或服務器上執(zhí)行。在涉及遠程計算機的情形中,遠程計算機可以通過任意種類的網(wǎng)絡—包括局域網(wǎng)(LAN)或廣域網(wǎng)(WAN)—連接到用戶計算機,或者,可以連接到外部計算機(例如利用因特網(wǎng)服務提供商來通過因特網(wǎng)連接)。在一些實施例中,通過利用計算機可讀程序指令的狀態(tài)信息來個性化定制電子電路,例如可編程邏輯電路、現(xiàn)場可編程門陣列(FPGA)或可編程邏輯陣列(PLA),該電子電路可以執(zhí)行計算機可讀程序指令,從而實現(xiàn)本發(fā)明的各個方面。
這里參照根據(jù)本發(fā)明實施例的方法、裝置(系統(tǒng))和計算機程序產(chǎn)品的流程圖和/或框圖描述了本發(fā)明的各個方面。應當理解,流程圖和/或框圖的每個方框以及流程圖和/或框圖中各方框的組合,都可以由計算機可讀程序指令實現(xiàn)。
這些計算機可讀程序指令可以提供給通用計算機、專用計算機或其它可編程數(shù)據(jù)處理裝置的處理器,從而生產(chǎn)出一種機器,使得這些指令在通過計算機或其它可編程數(shù)據(jù)處理裝置的處理器執(zhí)行時,產(chǎn)生了實現(xiàn)流程圖和/或框圖中的一個或多個方框中規(guī)定的功能/動作的裝置。也可以把這些計算機可讀程序指令存儲在計算機可讀存儲介質(zhì)中,這些指令使得計算機、可編程數(shù)據(jù)處理裝置和/或其他設備以特定方式工作,從而,存儲有指令的計算機可讀介質(zhì)則包括一個制造品,其包括實現(xiàn)流程圖和/或框圖中的一個或多個方框中規(guī)定的功能/動作的各個方面的指令。
也可以把計算機可讀程序指令加載到計算機、其它可編程數(shù)據(jù)處理裝置、或其它設備上,使得在計算機、其它可編程數(shù)據(jù)處理裝置或其它設備上執(zhí)行一系列操作步驟,以產(chǎn)生計算機實現(xiàn)的過程,從而使得在計算機、其它可編程數(shù)據(jù)處理裝置、或其它設備上執(zhí)行的指令實現(xiàn)流程圖和/或框圖中的一個或多個方框中規(guī)定的功能/動作。
附圖中的流程圖和框圖顯示了根據(jù)本發(fā)明的多個實施例的系統(tǒng)、方法和計算機程序產(chǎn)品的可能實現(xiàn)的體系架構、功能和操作。在這點上,流程圖或框圖中的每個方框可以代表一個模塊、程序段或指令的一部分,所述模塊、程序段或指令的一部分包含一個或多個用于實現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。在有些作為替換的實現(xiàn)中,方框中所標注的功能也可以以不同于附圖中所標注的順序發(fā)生。例如,兩個連續(xù)的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或動作的專用的基于硬件的系統(tǒng)來實現(xiàn),或者可以用專用硬件與計算機指令的組合來實現(xiàn)。
以上已經(jīng)描述了本發(fā)明的各實施例,上述說明是示例性的,并非窮盡性的,并且也不限于所披露的各實施例。在不偏離所說明的各實施例的范圍和精神的情況下,對于本技術領域的普通技術人員來說許多修改和變更都是顯而易見的。