專利名稱:一種角色動(dòng)畫實(shí)現(xiàn)方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種角色動(dòng)畫實(shí)現(xiàn)方法及系統(tǒng),其屬于計(jì)算機(jī)圖像顯示技術(shù)領(lǐng)域。
背景技術(shù):
在游戲中,為了滿足玩家個(gè)性化的需求,往往需要設(shè)計(jì)大量的圖素,并通過(guò)復(fù)雜的換裝系統(tǒng)豐富圖素的輸出。因此,動(dòng)畫顯示技術(shù)中經(jīng)常要面臨以下問(wèn)題。有的畫面包括了大量的圖素,例如一個(gè)游戲畫面中包括了多個(gè)玩家角色,每個(gè)角色具有各不相同的造型,并且同時(shí)進(jìn)行各不相同的動(dòng)作操作?,F(xiàn)有的動(dòng)畫輸出技術(shù)包括動(dòng)態(tài)加載和靜態(tài)加載方式。所述動(dòng)態(tài)加載是指當(dāng)用到某一個(gè)圖素時(shí),才把該圖素從硬件存儲(chǔ)空間加載到內(nèi)存;所述靜態(tài)加載是指在程序開(kāi)始時(shí),把所有的圖素加載到內(nèi)存中,等待應(yīng)用程序調(diào)用。當(dāng)畫面中包含大量圖素的時(shí)候,若使用動(dòng)態(tài)加載的方式輸出畫面,采用動(dòng)態(tài)加載方式,如果畫面圖素過(guò)多, 大量的數(shù)據(jù)會(huì)導(dǎo)致硬件輸入I/O的阻塞而引起程序阻塞,導(dǎo)致動(dòng)畫畫面輸出不連續(xù),影響動(dòng)畫輸出質(zhì)量;若使用靜態(tài)加載的方式輸出動(dòng)畫,該方法需要預(yù)先加載大量的數(shù)據(jù),而導(dǎo)致啟動(dòng)程序時(shí)間過(guò)長(zhǎng)和占用內(nèi)存過(guò)多的問(wèn)題。為了解決上述問(wèn)題,現(xiàn)有游戲中的動(dòng)畫顯示技術(shù)多采用如下的方案程序開(kāi)始時(shí), 加載部分圖素到內(nèi)存中,可以根據(jù)需求,在程序中預(yù)先確定所要加載的圖素;程序過(guò)程中, 若當(dāng)前要顯示的圖素不再內(nèi)存當(dāng)中,則淘汰內(nèi)存中的部分圖素,釋放空間后加載要使用的圖素?,F(xiàn)有的方法的缺陷在于由于在啟動(dòng)時(shí),需要加載部分圖素,因此導(dǎo)致較長(zhǎng)的程序啟動(dòng)時(shí)間。專利ZL200510131814. X中提高了采用預(yù)置幀顯示規(guī)則解決這個(gè)問(wèn)題,但是其在加載圖素前判斷內(nèi)存空間不足,采用淘汰內(nèi)存中最久未使用的圖素。但是最久為使用的圖素可能在使用的時(shí)候被大量調(diào)用過(guò),這樣會(huì)導(dǎo)致圖素的重復(fù)導(dǎo)入,浪費(fèi)大量的時(shí)間和資源。
發(fā)明內(nèi)容
為解決上述問(wèn)題,本發(fā)明的目的是提供一種角色動(dòng)畫實(shí)現(xiàn)方法及系統(tǒng),該方法能夠減少動(dòng)畫加載過(guò)程中的硬件I/O阻塞,并減少內(nèi)存占用容量。為解決上述技術(shù)問(wèn)題,本發(fā)明提供了一種角色動(dòng)畫實(shí)現(xiàn)方法及系統(tǒng),包括預(yù)置幀顯示規(guī)則,用于選取組成動(dòng)畫的所有幀中的部分幀進(jìn)行顯示輸出;根據(jù)所述的幀顯示規(guī)則, 獲取當(dāng)前顯示循環(huán)中需要加載顯示的幀的編號(hào);判斷所述需要加載顯示的幀是否已被加載到內(nèi)存,若是則直接顯示;否則加載該編號(hào)的幀到內(nèi)存并進(jìn)行輸出顯示。其中,所述規(guī)則為選取動(dòng)畫中編號(hào)為等差排列的幀進(jìn)行顯示。該規(guī)則的一種算法為=Xl = floor (floor (X/F) *F+mod (X, F)/Pl) *P1,其中F為動(dòng)畫總幀數(shù),Pl為動(dòng)畫質(zhì)量系數(shù),Xl為當(dāng)前選取顯示的幀編號(hào),X為順序播放F幀時(shí)當(dāng)前顯示循環(huán)對(duì)應(yīng)于的幀編號(hào)。其中,動(dòng)畫質(zhì)量系數(shù)Pl以等比數(shù)列設(shè)置,以對(duì)應(yīng)于不同幀縮減數(shù);進(jìn)而在動(dòng)畫顯示之前通過(guò)確定動(dòng)畫質(zhì)量系數(shù)Pl。在上述方法基礎(chǔ)上,采用C++標(biāo)準(zhǔn)庫(kù)提供的MAP儲(chǔ)存所加載圖素的信息,通過(guò)遍歷 MAP,判斷當(dāng)前要加載的圖素是否已在內(nèi)存中。
在上述方法基礎(chǔ)上,進(jìn)一步限制每一顯示循環(huán)中圖素的加載量;進(jìn)而,若在確定的顯示循環(huán)中需要顯示的圖素未能加載到內(nèi)存,則調(diào)用該動(dòng)畫在內(nèi)存中最近一次顯示循環(huán)中加載的圖素。具體的,限制圖素加載量的方法可采用判斷已加載圖素的總?cè)萘颗c當(dāng)前要加載的圖素容量之和是否不小于門限值,若大于則停止該顯示循環(huán)中加載圖素的操作。在上述方法基礎(chǔ)上,加載圖素前判斷內(nèi)存空間大小,若內(nèi)存空間不足,則采用下述方法淘汰圖片,方法如下P = Pl氺a/b+P2氺c/d ;其中P1表示個(gè)人對(duì)最長(zhǎng)時(shí)間沒(méi)出現(xiàn)圖片的偏好;P2表示個(gè)人對(duì)出現(xiàn)頻率最少的圖片的偏好;a表示一個(gè)圖片出現(xiàn)的總次數(shù);b表示運(yùn)行總次數(shù);c表示該圖片出現(xiàn)的次數(shù)序號(hào)之和;d表示運(yùn)行次數(shù)序號(hào)之和。本發(fā)明在內(nèi)存空間不足時(shí),采用對(duì)最近未出現(xiàn)圖片和出現(xiàn)頻率最低的圖片的權(quán)重,同時(shí)加入個(gè)人偏好,不但很好的降低了系統(tǒng)負(fù)荷,提高了動(dòng)畫輸出的流暢性,同時(shí)也滿足了不同人的不同要求,進(jìn)步提高了此方法的可用性。
具體實(shí)施例方式本發(fā)明提供了一種角色動(dòng)畫實(shí)現(xiàn)方法及系統(tǒng);所述動(dòng)畫由一組連續(xù)的并具有漸變效果的圖片組成,每張圖片稱為一幀,一個(gè)動(dòng)畫通常用于表現(xiàn)一個(gè)完整的動(dòng)作,幀數(shù)越多, 動(dòng)作表現(xiàn)得越平滑。所述幀即為每個(gè)顯示循環(huán)中顯示的圖片(圖素)例如,一個(gè)蝴蝶翅膀扇動(dòng)的動(dòng)畫,由數(shù)幅翅膀位置不同的圖片連續(xù)組成,當(dāng)圖片連續(xù)播放時(shí)即顯示為翅膀扇動(dòng)的效果。在動(dòng)畫中包含了若干個(gè)顯示循環(huán),動(dòng)畫畫面的繪制是以時(shí)間為周期的循環(huán)過(guò)程,在每個(gè)顯示循環(huán)內(nèi)完成一次畫面展現(xiàn)和必要的邏輯運(yùn)算;每個(gè)顯示循環(huán)內(nèi),畫面內(nèi)所有的動(dòng)畫都顯示一幀,循環(huán)的時(shí)間可根據(jù)需要定制,例如,現(xiàn)有游戲中通常將動(dòng)畫顯示循環(huán)的周期設(shè)置為50毫秒。在以上公知概念基礎(chǔ)上,具體說(shuō)明本發(fā)明的優(yōu)選實(shí)施例。為了在動(dòng)畫顯示輸出過(guò)程中達(dá)到減少硬件I/O阻塞以及節(jié)省內(nèi)存空間,以保證動(dòng)畫顯示流暢的目的,本實(shí)施例的核心包括一下三方面的內(nèi)容。1)對(duì)一幅動(dòng)畫中的幀進(jìn)行刪減,以使動(dòng)畫輸出過(guò)程中節(jié)省內(nèi)存空間。假設(shè)一幅動(dòng)畫由編號(hào)為1到10的10個(gè)幀組成。本發(fā)明的原則是按照一定的規(guī)則在動(dòng)畫時(shí)長(zhǎng)不變的情況下,可以只加載并顯示編號(hào)為1,3,5,7,9的幀,或者只加載顯示編號(hào)為1,5,9的幀。具體的,如以下給出的算法實(shí)例,設(shè)請(qǐng)求繪制一幅動(dòng)畫的第X幀,按照下面的公式進(jìn)行計(jì)算,實(shí)際加載顯示的幀Xl為Xl = floor (floor (X/F) *F+mod (Χ, F) /Pl) *P1其中F為該動(dòng)畫的總幀數(shù),即組成該動(dòng)畫的圖片總數(shù);floor為取整函數(shù),mod為取余函數(shù),X指代請(qǐng)求繪制的幀,Xl指代實(shí)際顯示輸出的幀,Pi為本實(shí)施例中設(shè)置的動(dòng)畫質(zhì)量系數(shù)。在上述算法中,通過(guò)系數(shù)P實(shí)現(xiàn)對(duì)動(dòng)畫幀縮減程度的控制,本實(shí)施例中采用等比數(shù)列的算法設(shè)置P1,對(duì)P取值設(shè)置一個(gè)范圍;進(jìn)而為用戶提供一個(gè)動(dòng)畫質(zhì)量的選項(xiàng),例如選項(xiàng)內(nèi)容可包括高級(jí)動(dòng)畫質(zhì)量、中級(jí)動(dòng)畫質(zhì)量、低級(jí)動(dòng)畫質(zhì)量等;該些選項(xiàng)分別對(duì)應(yīng)于P的幾個(gè)值。用戶可以根據(jù)自己機(jī)器的配置優(yōu)劣,通過(guò)選擇選項(xiàng)內(nèi)容間接修改Pi的值,如果機(jī)器配置低,則用戶可以選擇低級(jí)動(dòng)畫質(zhì)量,那么這個(gè)動(dòng)畫最終加載顯示的幀數(shù)就少,即由上文所舉算法公式可知,動(dòng)畫質(zhì)量越低,X與Xl的間隔數(shù)越高,加載顯示的幀數(shù)越少。上文所舉實(shí)例采用等比數(shù)列的算法對(duì)不同質(zhì)量要求的進(jìn)行幀的刪減,在本發(fā)明中,依據(jù)業(yè)務(wù)應(yīng)用的具體需求可采用其他算法,例如其他線性或非線性的算法選擇動(dòng)畫中的部分幀進(jìn)行顯示輸出。具體算法和參數(shù)配置方式本領(lǐng)域技術(shù)人員可以自行定制。舉例比如有一個(gè)角色的跑步動(dòng)畫,包含20個(gè)關(guān)鍵幀。幀數(shù)編號(hào)從1 一直到20。 在這20幀動(dòng)畫中,每一幀的位置都與上一幀有著微小的差距。但是從差距大小上來(lái)看并不不是很大。對(duì)于動(dòng)畫的質(zhì)量要求越高,那么對(duì)應(yīng)的關(guān)鍵幀也就越多。一般上當(dāng)每秒播放30個(gè)關(guān)鍵幀的時(shí)候,人對(duì)這種微小的差距就么有了什么感覺(jué)。對(duì)于我們的動(dòng)畫來(lái)說(shuō),如果他在一秒中播放了 60幀,這個(gè)時(shí)候這個(gè)動(dòng)畫必然會(huì)占用更多的硬件資源,而且這個(gè)效果完全是多余的。所以我們采用上述的方法對(duì)動(dòng)畫的關(guān)鍵幀數(shù)進(jìn)行刪減。采用我們的30幀標(biāo)準(zhǔn), 我們可以對(duì)這60幀動(dòng)畫進(jìn)行對(duì)半的幀數(shù)精簡(jiǎn),以達(dá)到提高資源利用率,減少內(nèi)存損耗的目的。如取動(dòng)畫的質(zhì)量系數(shù)為2時(shí),即顯示的關(guān)鍵幀是1,3,5,7,9等。在第二個(gè)顯示循環(huán)中, 系統(tǒng)通過(guò)上述公式計(jì)算得出當(dāng)前加載的幀仍是第1幀,此時(shí)不需重新進(jìn)行第1幀加載的操作,而直接調(diào)用已加載到內(nèi)存中的第1幀進(jìn)行輸出,即所選每一幀在保持連續(xù)兩個(gè)顯示循環(huán)的輸出,即所選每一幀在保持連續(xù)兩個(gè)顯示循環(huán)的輸出,依此類推該動(dòng)畫仍使用30個(gè)顯示循環(huán)完成了主角跑步過(guò)程的展現(xiàn)。下表中是動(dòng)畫質(zhì)量系數(shù)分別等于2和4時(shí)的幀加載情況。2)控制每個(gè)顯示循環(huán)中的圖素加載量。每個(gè)顯示循環(huán)中,都會(huì)加載一定容量的圖素到內(nèi)存。所述圖素對(duì)應(yīng)著動(dòng)畫中的一幀,是圖像的最小繪制單元。本發(fā)明中進(jìn)一步通過(guò)對(duì)每個(gè)顯示循環(huán)中的流量進(jìn)行控制,保證了在一個(gè)顯示循環(huán)內(nèi)能夠合理的分配資源完成圖素的計(jì)算、圖素的加載以及圖素的繪制; 并且,如果在確定的顯示循環(huán)中需要顯示的某動(dòng)畫的圖素未能加載到內(nèi)存,則調(diào)用該動(dòng)畫在內(nèi)存中最近一次顯示循環(huán)中加載的圖素。為了實(shí)現(xiàn)該目的,具體實(shí)現(xiàn)中可設(shè)置一個(gè)門限值Q作為每次顯示循環(huán)時(shí)可以加載圖素的最大容量,該門限值Q可通過(guò)具體的業(yè)務(wù)需求、實(shí)際經(jīng)驗(yàn)值以及根據(jù)內(nèi)存和硬盤的計(jì)算速度確定;設(shè)置一個(gè)參數(shù)Q1,用于記錄每次顯示循環(huán)時(shí)圖素加載的總?cè)萘?。?dāng)圖素的加載容量Ql大于或者等于設(shè)定的最大容量Q時(shí),則在當(dāng)前顯示循環(huán)中,停止加載圖素到內(nèi)存。如果在當(dāng)前顯示循環(huán)中需要顯示的圖素未能加載到內(nèi)存中,則查找最近一次的顯示循環(huán)中該動(dòng)畫所使用的圖素進(jìn)行顯示。當(dāng)本次顯示循環(huán)結(jié)束時(shí),將Ql值清零,開(kāi)始下一個(gè)顯示循環(huán)圖素加載量的計(jì)算。例如,還是以人物的跑步動(dòng)畫作為例子,這個(gè)動(dòng)畫,使用5個(gè)顯示循環(huán)完成角色跑步的過(guò)程,并且每個(gè)顯示循環(huán)顯示一幀的畫面,幀編號(hào)分別為1、2、3、4、5。設(shè)在下一個(gè)顯示循環(huán)中將顯示第3幀,則需加載第3幀畫面中的各圖素到內(nèi)存。假設(shè)在采用上述流量控制的情況下,由于第三幀加載到內(nèi)存的圖素量達(dá)到了預(yù)置的門限,使得第三幀的動(dòng)畫為加載到內(nèi)存中。這個(gè)時(shí)候根據(jù)動(dòng)畫的連續(xù)性,選擇最近一次播放的動(dòng)畫來(lái)作為此次的繪制輸出。本舉例中,在加載圖素前,判斷已加載圖素的總?cè)萘颗c當(dāng)前要加載的圖素容量之和是否大于或等于門限值,若是,則調(diào)用該動(dòng)畫在內(nèi)存中最近一次顯示循環(huán)中所加載的圖素。否則,加載顯示當(dāng)前要加載的圖素。本發(fā)明中并不排除其他設(shè)置內(nèi)存占用門限的方法, 如內(nèi)存占用率等。3)對(duì)內(nèi)存的管理。每個(gè)顯示循環(huán)都包括往內(nèi)存中加載圖素的操作,當(dāng)內(nèi)存空間不足時(shí),采用,則采用下述方法淘汰圖片,方法如下P = Pl*a/b+P2*c/d ;其中P1表示個(gè)人對(duì)最長(zhǎng)時(shí)間沒(méi)出現(xiàn)圖片的偏好;P2表示個(gè)人對(duì)出現(xiàn)頻率最少的圖片的偏好;a表示一個(gè)圖片出現(xiàn)的總次數(shù);b表示運(yùn)行總次數(shù);c表示該圖片出現(xiàn)的次數(shù)序號(hào)之和;d表示運(yùn)行次數(shù)序號(hào)之和,以釋放內(nèi)存空間,用于加載新的圖素。以上具體介紹了本發(fā)明中所采用的部分技術(shù)手段。本發(fā)明的操作步驟1)當(dāng)內(nèi)存空間不足時(shí),,則采用下述方法淘汰圖片,方法如下P = Pl*a/b+P2*c/d ;其中P1表示個(gè)人對(duì)最長(zhǎng)時(shí)間沒(méi)出現(xiàn)圖片的偏好;P2表示個(gè)人對(duì)出現(xiàn)頻率最少的圖片的偏好;a表示一個(gè)圖片出現(xiàn)的總次數(shù);b表示運(yùn)行總次數(shù);c表示該圖片出現(xiàn)的次數(shù)序號(hào)之和;d表示運(yùn)行次數(shù)序號(hào)之和。2)依據(jù)預(yù)置的算法計(jì)算當(dāng)前顯示循環(huán)中實(shí)際加載的幀Xl ;判斷幀Xl是否已被加載到內(nèi)存,若否則進(jìn)行步驟3,否則之間進(jìn)行輸出示;本實(shí)施例中采用C++標(biāo)準(zhǔn)庫(kù)提供的MAP 儲(chǔ)存所加載圖素的信息,通過(guò)遍歷MAP,可判斷當(dāng)前要加載的圖素是否已在內(nèi)存中;3)計(jì)算當(dāng)前顯示循環(huán)中已加載的圖素容量;4)判斷當(dāng)前已加載容量是否達(dá)到預(yù)置門限,若否則進(jìn)行步驟15,若時(shí)則進(jìn)行步驟 6 ;5)繼續(xù)加載動(dòng)畫第Xl幀的圖素;6)對(duì)于未能加載的圖素,返回最近一次繪制動(dòng)畫所使用的幀。操作結(jié)束。
權(quán)利要求
1. 一種角色動(dòng)畫實(shí)現(xiàn)方法及系統(tǒng),包括預(yù)置幀顯示規(guī)則,用于選取組成動(dòng)畫的所有幀中的部分幀進(jìn)行顯示輸出;根據(jù)所述的幀顯示規(guī)則,獲取當(dāng)前顯示循環(huán)中需要加載顯示的幀的編號(hào);判斷所述需要加載顯示的幀是否已被加載到內(nèi)存,若是則直接顯示;否則加載該編號(hào)的幀到內(nèi)存并進(jìn)行輸出顯示;所述規(guī)則為選取動(dòng)畫中編號(hào)為等差排列的幀進(jìn)行顯示;該規(guī)則的算法為xi = floor(floor(X/F)*F+mod(X,F(xiàn))/Pl)*Pl,其中F為動(dòng)畫總幀數(shù), Pl為動(dòng)畫質(zhì)量系數(shù),Xl為當(dāng)前選取顯示的幀編號(hào),X為順序播放F幀時(shí)當(dāng)前顯示循環(huán)對(duì)應(yīng)于的幀編號(hào)。其中,動(dòng)畫質(zhì)量系數(shù)Pl以等比數(shù)列設(shè)置,以對(duì)應(yīng)于不同幀縮減數(shù);進(jìn)而在動(dòng)畫顯示之前通過(guò)確定動(dòng)畫質(zhì)量系數(shù)Pl ;采用C++標(biāo)準(zhǔn)庫(kù)提供的MAP儲(chǔ)存所加載圖素的信息, 通過(guò)遍歷MAP,判斷當(dāng)前要加載的圖素是否已在內(nèi)存中;進(jìn)一步限制每一顯示循環(huán)中圖素的加載量;在確定的顯示循環(huán)中需要顯示的圖素未能加載到內(nèi)存,則調(diào)用該動(dòng)畫在內(nèi)存中最近一次顯示循環(huán)中加載的圖素;限制圖素加載量的方法采用判斷已加載圖素的總?cè)萘颗c當(dāng)前要加載的圖素容量之和是否不小于門限值,若大于則停止該顯示循環(huán)中加載圖素的操作;其特征在于在加載圖素前判斷內(nèi)存空間大小,若內(nèi)存空間不足,則采用下述方法淘汰圖片,方法如下P = Pl*a/b+P2*c/d ;其中P1表示個(gè)人對(duì)最長(zhǎng)時(shí)間沒(méi)出現(xiàn)圖片的偏好;P2表示個(gè)人對(duì)出現(xiàn)頻率最少的圖片的偏好;a表示一個(gè)圖片出現(xiàn)的總次數(shù);b表示運(yùn)行總次數(shù);c表示該圖片出現(xiàn)的次數(shù)序號(hào)之和;d表示運(yùn)行次數(shù)序號(hào)之和。
全文摘要
本發(fā)明涉及一種角色動(dòng)畫實(shí)現(xiàn)方法及系統(tǒng);其屬于計(jì)算機(jī)圖像顯示技術(shù)領(lǐng)域。本發(fā)明在內(nèi)存空間不足時(shí),采用對(duì)最近未出現(xiàn)圖片和出現(xiàn)頻率最低的圖片的權(quán)重,同時(shí)加入個(gè)人偏好,不但很好的降低了系統(tǒng)負(fù)荷,提高了動(dòng)畫輸出的流暢性,同時(shí)也滿足了不同人的不同要求,進(jìn)步提高了此方法的可用性。
文檔編號(hào)G06T13/40GK102521866SQ20111036251
公開(kāi)日2012年6月27日 申請(qǐng)日期2011年11月16日 優(yōu)先權(quán)日2011年11月16日
發(fā)明者戚軍 申請(qǐng)人:戚軍