本發(fā)明涉及unity3d引擎領(lǐng)域,尤其涉及一種基于unity3d圖像渲染的優(yōu)化方法及系統(tǒng)。
背景技術(shù):
隨著vr技術(shù)的興起,全景視頻的需求也是節(jié)節(jié)攀升。傳統(tǒng)的視頻播放器都是將圖像渲染在一張平面的2d紋理上。而全景播放器則是需要隨著視角的變換,展示的內(nèi)容也隨之發(fā)生變化。這就需要在3d的坐標(biāo)系下才能滿足。目前unity是市面上熾手可熱的3d引擎,vlc則是成熟的開源視頻播放器。通過用unity3d引擎構(gòu)建場景物件(視頻投影幕),再利用vlc提供強(qiáng)大的視頻解碼能力,把輸出的紋理貼到3d的視頻投影幕上,則可投射出類似球形,方形的視頻出來,可以滿足了全景視頻的應(yīng)用場景,然而相比普通的2d播放器,需要帶來額外的性能消耗,其原因有兩方面:
一是相比2d播放器,全景播放器中用到的球形、方形或柱狀體等,這些模型所需要的面數(shù)精度遠(yuǎn)高于2d播放器中的一個平面(僅需要包含2個面即可),球形模型想要達(dá)到較好的精度,通常需要上萬的面數(shù)。在現(xiàn)代圖像學(xué)中最終是需要對每個面進(jìn)行uv映射,故全景播放器在進(jìn)行uv映射時需要消耗更多的性能;
二是視頻解碼器輸出的每一幀的視頻圖像并不能直接顯示在unity的模型上,需要先填充在一張unity的texture2d(unity紋理)上,再將這張texture2d貼在3d的視頻投影幕上才行,就如同把一張長方形的海報,按規(guī)定的坐標(biāo)映射關(guān)系貼到一個籃球上。unity對于圖像的渲染是有要求,必須要在主線程中進(jìn)行,而視頻解碼是個耗時的工作,如果也在主線程中進(jìn)行勢必造成整個播放器的渲染效率降低。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問題是:提供一種高效的基于unity3d圖像渲染的優(yōu)化方法及系統(tǒng)。
為了解決上述技術(shù)問題,本發(fā)明采用的技術(shù)方案為:
一種基于unity3d圖像渲染的優(yōu)化方法,包括:
預(yù)設(shè)緩存區(qū)域,所述緩存區(qū)域包括兩個以上的子區(qū)域;所述子區(qū)域的狀態(tài)包括空閑狀態(tài)和鎖定狀態(tài);
創(chuàng)建解碼線程,所述解碼線程將vlc視頻播放器輸出的已解碼的圖像信息寫入空閑狀態(tài)的子區(qū)域中;
變更子區(qū)域的狀態(tài)為鎖定狀態(tài);
于主線程創(chuàng)建渲染線程,所述渲染線程讀取鎖定狀態(tài)的子區(qū)域內(nèi)的圖像信息至unity3d,對圖像信息填充紋理后進(jìn)行圖像渲染。
本發(fā)明采用的另一技術(shù)方案為:
一種基于unity3d圖像渲染的優(yōu)化系統(tǒng),包括預(yù)設(shè)模塊、寫入模塊、變更模塊和讀取模塊;
預(yù)設(shè)模塊,用于預(yù)設(shè)緩存區(qū)域,所述緩存區(qū)域包括兩個以上的子區(qū)域;所述子區(qū)域的狀態(tài)包括空閑狀態(tài)和鎖定狀態(tài);
寫入模塊,用于創(chuàng)建解碼線程,所述解碼線程將vlc視頻播放器輸出的已解碼的圖像信息寫入空閑狀態(tài)的子區(qū)域中;
變更模塊,用于變更子區(qū)域的狀態(tài)為鎖定狀態(tài);
讀取模塊,用于于主線程創(chuàng)建渲染線程,所述渲染線程讀取鎖定狀態(tài)的子區(qū)域內(nèi)的圖像信息至unity3d,對圖像信息填充紋理后進(jìn)行圖像渲染。
本發(fā)明的有益效果在于:
本發(fā)明提供的基于unity3d圖像渲染的優(yōu)化方法及系統(tǒng),通過將解碼線程與渲染線程分離,二者不在同一線程中,使得視頻解碼不會造成整個播放器的渲染效果降低,再則由于二者不在同一線程,需要增加緩存的拷貝和同步,通過設(shè)置包括兩個以上的子區(qū)域的緩存區(qū)域,并且通過設(shè)置子區(qū)域的狀態(tài),實(shí)現(xiàn)解碼線程的寫入操作與渲染線程的讀取操作相互分離,避免將正在解碼中的數(shù)據(jù)進(jìn)行渲染,造成錯誤,并且能夠提升渲染效率。
附圖說明
圖1為本發(fā)明的基于unity3d圖像渲染的優(yōu)化方法的步驟流程圖;
圖2為本發(fā)明的基于unity3d圖像渲染的優(yōu)化系統(tǒng)的步驟流程圖;
標(biāo)號說明:
1、預(yù)設(shè)模塊;2、寫入模塊;3、變更模塊;4、讀取模塊。
具體實(shí)施方式
為詳細(xì)說明本發(fā)明的技術(shù)內(nèi)容、所實(shí)現(xiàn)目的及效果,以下結(jié)合實(shí)施方式并配合附圖予以說明。
本發(fā)明最關(guān)鍵的構(gòu)思在于:通過將解碼線程與渲染線程分離,二者不在同一線程中,通過設(shè)置包括兩個以上的子區(qū)域的緩存區(qū)域,并且通過設(shè)置子區(qū)域的狀態(tài),實(shí)現(xiàn)解碼線程的寫入操作與渲染線程的讀取操作相互分離,避免將正在解碼中的數(shù)據(jù)進(jìn)行渲染,造成錯誤。
請參照圖1,本發(fā)明提供的一種基于unity3d圖像渲染的優(yōu)化方法,包括:
預(yù)設(shè)緩存區(qū)域,所述緩存區(qū)域包括兩個以上的子區(qū)域;所述子區(qū)域的狀態(tài)包括空閑狀態(tài)和鎖定狀態(tài);
創(chuàng)建解碼線程,所述解碼線程將vlc視頻播放器輸出的已解碼的圖像信息寫入空閑狀態(tài)的子區(qū)域中;
變更子區(qū)域的狀態(tài)為鎖定狀態(tài);
于主線程創(chuàng)建渲染線程,所述渲染線程讀取鎖定狀態(tài)的子區(qū)域內(nèi)的圖像信息至unity3d,對圖像信息填充紋理后進(jìn)行圖像渲染。
從上述描述可知,本發(fā)明的有益效果在于:本發(fā)明提供的基于unity3d圖像渲染的優(yōu)化方法,通過將解碼線程與渲染線程分離,二者不在同一線程中,使得視頻解碼不會造成整個播放器的渲染效果降低,再則由于二者不在同一線程,需要增加緩存的拷貝和同步,通過設(shè)置包括兩個以上的子區(qū)域的緩存區(qū)域,并且通過設(shè)置子區(qū)域的狀態(tài),實(shí)現(xiàn)解碼線程的寫入操作與渲染線程的讀取操作相互分離,避免將正在解碼中的數(shù)據(jù)進(jìn)行渲染,造成錯誤,并且能夠提升渲染效率。
進(jìn)一步的,還包括:
圖像信息填充紋理后,鎖定狀態(tài)的子區(qū)域的狀態(tài)變更為空閑狀態(tài)。
由上述描述可知,在上述實(shí)施方式中,將圖像信息填充紋理后的子區(qū)域的狀態(tài)變更為空閑狀態(tài),也就是初始化,解碼線程識別到空閑狀態(tài)的子區(qū)域即可寫入圖像信息,實(shí)現(xiàn)內(nèi)存資源多次利用。
進(jìn)一步的,將vlc視頻播放器輸出的已解碼的圖像信息寫入空閑狀態(tài)的子區(qū)域中,之前還包括:
判斷所有子區(qū)域中是否存在狀態(tài)為空閑狀態(tài)的子區(qū)域,若是,則將vlc視頻播放器輸出的已解碼的圖像信息寫入空閑狀態(tài)的子區(qū)域中;若否,則間隔預(yù)設(shè)時長后繼續(xù)判斷所有子區(qū)域中是否存在狀態(tài)為空閑狀態(tài)的子區(qū)域。
由上述描述可知,在上述實(shí)施方式中,解碼線程在寫入圖像信息之前,事先判斷所有子區(qū)域的狀態(tài),子區(qū)域初始化時的狀態(tài)為空閑狀態(tài),空閑狀態(tài)的子區(qū)域是可以寫入圖像信息數(shù)據(jù)的,寫入后,該子區(qū)域的狀態(tài)就變更為鎖定狀態(tài),此時該子區(qū)域就不能用于接收圖像信息數(shù)據(jù)了,只能等待渲染線程讀取。因此,若所有的子區(qū)域的狀態(tài)都被標(biāo)記為鎖定狀態(tài),則需要等待預(yù)設(shè)時長后繼續(xù)判斷,直到存在空閑狀態(tài)的子區(qū)域,此時將圖像信息數(shù)據(jù)寫入至空閑狀態(tài)的子區(qū)域,從而有效地通過子區(qū)域的狀態(tài)將解碼線程與渲染線程相隔離。
進(jìn)一步的,若存在空閑狀態(tài)的子區(qū)域,將vlc視頻播放器輸出的已解碼的圖像信息寫入空閑狀態(tài)的子區(qū)域中,具體為:
若存在空閑狀態(tài)的子區(qū)域,獲取空閑狀態(tài)的子區(qū)域中字節(jié)數(shù)不少于圖像信息字節(jié)數(shù)的子區(qū)域,得到子區(qū)域集合;
將vlc視頻播放器輸出的已解碼的圖像信息寫入子區(qū)域集合中字節(jié)數(shù)最少的子區(qū)域。
由上述描述可知,在上述實(shí)施方式中,為了適應(yīng)不同字節(jié)大小的圖像信息,子區(qū)域的數(shù)量可以是多個的,并且子區(qū)域的字節(jié)空間也可以是不同的,此時先獲取空閑狀態(tài)的子區(qū)域中字節(jié)數(shù)不少于圖像信息字節(jié)數(shù)的子區(qū)域,得到子區(qū)域集合,該子區(qū)域集合內(nèi)的子區(qū)域也就是滿足裝載圖像信息字節(jié)數(shù)的要求,并且選擇該子區(qū)域集合內(nèi)字節(jié)數(shù)最少的子區(qū)域,即為最接近圖像信息字節(jié)數(shù)的子區(qū)域,實(shí)現(xiàn)提升子區(qū)域空間高利用率。
進(jìn)一步的,若子區(qū)域集合為空,將圖像信息按照預(yù)設(shè)固定字節(jié)長度劃分成多個子圖像信息,依次寫入空閑狀態(tài)的子區(qū)域中。
由上述描述可知,在上述實(shí)施方式中,若子區(qū)域集合為空,也就是說,該圖像信息的字節(jié)數(shù)超長,大于所有子區(qū)域的字節(jié)數(shù),所以將圖像信息按照預(yù)設(shè)固定字節(jié)長度劃分成多個子圖像信息,依次寫入空閑狀態(tài)的子區(qū)域中,從而解決超長字節(jié)圖像信息的裝載問題。
參閱圖2,本發(fā)明還提供的一種基于unity3d圖像渲染的優(yōu)化系統(tǒng),包括預(yù)設(shè)模塊1、寫入模塊2、變更模塊3和讀取模塊4;
預(yù)設(shè)模塊1,用于預(yù)設(shè)緩存區(qū)域,所述緩存區(qū)域包括兩個以上的子區(qū)域;所述子區(qū)域的狀態(tài)包括空閑狀態(tài)和鎖定狀態(tài);
寫入模塊2,用于創(chuàng)建解碼線程,所述解碼線程將vlc視頻播放器輸出的已解碼的圖像信息寫入空閑狀態(tài)的子區(qū)域中;
變更模塊3,用于變更子區(qū)域的狀態(tài)為鎖定狀態(tài);
讀取模塊4,用于于主線程創(chuàng)建渲染線程,所述渲染線程讀取鎖定狀態(tài)的子區(qū)域內(nèi)的圖像信息至unity3d,對圖像信息填充紋理后進(jìn)行圖像渲染。
從上述描述可知,本發(fā)明的有益效果在于:本發(fā)明提供的基于unity3d圖像渲染的優(yōu)化系統(tǒng),通過將解碼線程與渲染線程分離,二者不在同一線程中,使得視頻解碼不會造成整個播放器的渲染效果降低,再則由于二者不在同一線程,需要增加緩存的拷貝和同步,通過設(shè)置包括兩個以上的子區(qū)域的緩存區(qū)域,并且通過設(shè)置子區(qū)域的狀態(tài),實(shí)現(xiàn)解碼線程的寫入操作與渲染線程的讀取操作相互分離,避免將正在解碼中的數(shù)據(jù)進(jìn)行渲染,造成錯誤,并且能夠提升渲染效率。
進(jìn)一步的,還包括變更單元,用于圖像信息填充紋理后,鎖定狀態(tài)的子區(qū)域的狀態(tài)變更為空閑狀態(tài)。
由上述描述可知,在上述實(shí)施方式中,將圖像信息填充紋理后的子區(qū)域的狀態(tài)變更為空閑狀態(tài),也就是初始化,解碼線程識別到空閑狀態(tài)的子區(qū)域即可寫入圖像信息,實(shí)現(xiàn)內(nèi)存資源多次利用。
進(jìn)一步的,還包括判斷模塊,用于判斷所有子區(qū)域中是否存在狀態(tài)為空閑狀態(tài)的子區(qū)域,若是,則將vlc視頻播放器輸出的已解碼的圖像信息寫入空閑狀態(tài)的子區(qū)域中;若否,則間隔預(yù)設(shè)時長后繼續(xù)判斷所有子區(qū)域中是否存在狀態(tài)為空閑狀態(tài)的子區(qū)域。
由上述描述可知,在上述實(shí)施方式中,解碼線程在寫入圖像信息之前,事先判斷所有子區(qū)域的狀態(tài),子區(qū)域初始化時的狀態(tài)為空閑狀態(tài),空閑狀態(tài)的子區(qū)域是可以寫入圖像信息數(shù)據(jù)的,寫入后,該子區(qū)域的狀態(tài)就變更為鎖定狀態(tài),此時該子區(qū)域就不能用于接收圖像信息數(shù)據(jù)了,只能等待渲染線程讀取。因此,若所有的子區(qū)域的狀態(tài)都被標(biāo)記為鎖定狀態(tài),則需要等待預(yù)設(shè)時長后繼續(xù)判斷,直到存在空閑狀態(tài)的子區(qū)域,此時將圖像信息數(shù)據(jù)寫入至空閑狀態(tài)的子區(qū)域,從而有效地通過子區(qū)域的狀態(tài)將解碼線程與渲染線程相隔離。
進(jìn)一步的,所述判斷模塊,還用于若存在空閑狀態(tài)的子區(qū)域,獲取空閑狀態(tài)的子區(qū)域中字節(jié)數(shù)不少于圖像信息字節(jié)數(shù)的子區(qū)域,得到子區(qū)域集合;將vlc視頻播放器輸出的已解碼的圖像信息寫入子區(qū)域集合中字節(jié)數(shù)最少的子區(qū)域。
由上述描述可知,在上述實(shí)施方式中,為了適應(yīng)不同字節(jié)大小的圖像信息,子區(qū)域的數(shù)量可以是多個的,并且子區(qū)域的字節(jié)空間也可以是不同的,此時先獲取空閑狀態(tài)的子區(qū)域中字節(jié)數(shù)不少于圖像信息字節(jié)數(shù)的子區(qū)域,得到子區(qū)域集合,該子區(qū)域集合內(nèi)的子區(qū)域也就是滿足裝載圖像信息字節(jié)數(shù)的要求,并且選擇該子區(qū)域集合內(nèi)字節(jié)數(shù)最少的子區(qū)域,即為最接近圖像信息字節(jié)數(shù)的子區(qū)域,實(shí)現(xiàn)提升子區(qū)域空間高利用率。
進(jìn)一步的,還包括劃分模塊,用于若子區(qū)域集合為空,將圖像信息按照預(yù)設(shè)固定字節(jié)長度劃分成多個子圖像信息,依次寫入空閑狀態(tài)的子區(qū)域中。
由上述描述可知,在上述實(shí)施方式中,若子區(qū)域集合為空,也就是說,該圖像信息的字節(jié)數(shù)超長,大于所有子區(qū)域的字節(jié)數(shù),所以將圖像信息按照預(yù)設(shè)固定字節(jié)長度劃分成多個子圖像信息,依次寫入空閑狀態(tài)的子區(qū)域中,從而解決超長字節(jié)圖像信息的裝載問題。
本發(fā)明實(shí)施一
本發(fā)明提供的一種基于unity3d圖像渲染的優(yōu)化方法,包括:
預(yù)設(shè)緩存區(qū)域,所述緩存區(qū)域包括兩個以上的子區(qū)域;所述子區(qū)域的狀態(tài)包括空閑狀態(tài)和鎖定狀態(tài);
在實(shí)施方式中,緩存區(qū)域可以劃分成兩個以上的子區(qū)域,例如兩個子區(qū)域,兩個子區(qū)域的初始化狀態(tài)均為空閑狀態(tài),即為未裝載數(shù)據(jù)時的狀態(tài),當(dāng)子區(qū)域裝載了數(shù)據(jù),其狀態(tài)就被標(biāo)記為鎖定狀態(tài),當(dāng)數(shù)據(jù)被渲染線程讀取渲染后,該子區(qū)域的狀態(tài)就又變回空閑狀態(tài),供解碼線程寫入圖像信息,該圖像信息為二進(jìn)制數(shù)據(jù)。
創(chuàng)建解碼線程,所述解碼線程將vlc視頻播放器輸出的已解碼的圖像信息寫入空閑狀態(tài)的子區(qū)域中;
在實(shí)施方式中,在寫入數(shù)據(jù)之前還包括:判斷所有子區(qū)域中是否存在狀態(tài)為空閑狀態(tài)的子區(qū)域,若是,則將vlc視頻播放器輸出的已解碼的圖像信息寫入空閑狀態(tài)的子區(qū)域中;若否,則間隔預(yù)設(shè)時長后繼續(xù)判斷所有子區(qū)域中是否存在狀態(tài)為空閑狀態(tài)的子區(qū)域。
解碼線程在寫入圖像信息之前,事先判斷所有子區(qū)域的狀態(tài),子區(qū)域初始化時的狀態(tài)為空閑狀態(tài),空閑狀態(tài)的子區(qū)域是可以寫入圖像信息數(shù)據(jù)的,寫入后,該子區(qū)域的狀態(tài)就變更為鎖定狀態(tài),此時該子區(qū)域就不能用于接收圖像信息數(shù)據(jù)了,只能等待渲染線程讀取。因此,若所有的子區(qū)域的狀態(tài)都被標(biāo)記為鎖定狀態(tài),則需要等待預(yù)設(shè)時長后繼續(xù)判斷,直到存在空閑狀態(tài)的子區(qū)域,此時將圖像信息數(shù)據(jù)寫入至空閑狀態(tài)的子區(qū)域,從而有效地通過子區(qū)域的狀態(tài)將解碼線程與渲染線程相隔離。
上述步驟還包括:若存在空閑狀態(tài)的子區(qū)域,獲取空閑狀態(tài)的子區(qū)域中字節(jié)數(shù)不少于圖像信息字節(jié)數(shù)的子區(qū)域,得到子區(qū)域集合;將vlc視頻播放器輸出的已解碼的圖像信息寫入子區(qū)域集合中字節(jié)數(shù)最少的子區(qū)域。
為了適應(yīng)不同字節(jié)大小的圖像信息,子區(qū)域的數(shù)量可以是多個的,并且子區(qū)域的字節(jié)空間也可以是不同的,此時先獲取空閑狀態(tài)的子區(qū)域中字節(jié)數(shù)不少于圖像信息字節(jié)數(shù)的子區(qū)域,得到子區(qū)域集合,該子區(qū)域集合內(nèi)的子區(qū)域也就是滿足裝載圖像信息字節(jié)數(shù)的要求,并且選擇該子區(qū)域集合內(nèi)字節(jié)數(shù)最少的子區(qū)域,即為最接近圖像信息字節(jié)數(shù)的子區(qū)域,實(shí)現(xiàn)提升子區(qū)域空間高利用率。
再則,若子區(qū)域集合為空,將圖像信息按照預(yù)設(shè)固定字節(jié)長度劃分成多個子圖像信息,依次寫入空閑狀態(tài)的子區(qū)域中。若子區(qū)域集合為空,也就是說,該圖像信息的字節(jié)數(shù)超長,大于所有子區(qū)域的字節(jié)數(shù),所以將圖像信息按照預(yù)設(shè)固定字節(jié)長度劃分成多個子圖像信息,依次寫入空閑狀態(tài)的子區(qū)域中,從而解決超長字節(jié)圖像信息的裝載問題。
寫入數(shù)據(jù)之后,變更子區(qū)域的狀態(tài)為鎖定狀態(tài);
于主線程創(chuàng)建渲染線程,所述渲染線程讀取鎖定狀態(tài)的子區(qū)域內(nèi)的圖像信息至unity3d,對圖像信息填充紋理后進(jìn)行圖像渲染。
在實(shí)施方式中,渲染線程進(jìn)行texture2d的填充。待填充完texture2d后,將子區(qū)域的狀態(tài)改回成空閑狀態(tài)。在這個過程中解碼線程再次解碼出一幀圖像,此時檢測到子區(qū)域?yàn)殒i定狀態(tài),則不選擇該子區(qū)域進(jìn)行數(shù)據(jù)裝填,而是選擇其他空閑狀態(tài)的子區(qū)域進(jìn)行數(shù)據(jù)裝載,就不用等到渲染線程對該子區(qū)域讀取完成后才能進(jìn)行下一次解碼,因此能夠提高了兩個線程的工作效率。
綜上所述,本發(fā)明提供的一種基于unity3d圖像渲染的優(yōu)化方法及系統(tǒng),通過將解碼線程與渲染線程分離,二者不在同一線程中,使得視頻解碼不會造成整個播放器的渲染效果降低,再則由于二者不在同一線程,需要增加緩存的拷貝和同步,通過設(shè)置包括兩個以上的子區(qū)域的緩存區(qū)域,并且通過設(shè)置子區(qū)域的狀態(tài),實(shí)現(xiàn)解碼線程的寫入操作與渲染線程的讀取操作相互分離,避免將正在解碼中的數(shù)據(jù)進(jìn)行渲染,造成錯誤,并且能夠提升渲染效率。通過對子區(qū)域的篩選以及對超長字節(jié)圖像信息的分割,進(jìn)一步提升整個過程的效率。本發(fā)明提供的基于unity3d圖像渲染的優(yōu)化方法及系統(tǒng)應(yīng)用在unity構(gòu)建好場景物件(視頻的投影幕)以及vlc提供的強(qiáng)大的視頻解碼能力,把輸出的紋理貼到3d的投影幕上,則可投射出類似球形、方形的視頻出來,也就滿足了全景視頻的應(yīng)用場景。
以上所述僅為本發(fā)明的實(shí)施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等同變換,或直接或間接運(yùn)用在相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專利保護(hù)范圍內(nèi)。