欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

圖像顯示系統(tǒng)及圖像顯示方法

文檔序號:6517492閱讀:436來源:國知局
圖像顯示系統(tǒng)及圖像顯示方法
【專利摘要】本發(fā)明提供一種圖像顯示系統(tǒng),包括服務(wù)端和客戶端。服務(wù)端包括API重定向模塊、API記錄模塊、打包模塊和壓縮模塊。API重定向模塊將處理單元運行應(yīng)用時發(fā)出的第一API定向到封裝層中對應(yīng)的第二API,API記錄模塊記錄第一API信息并生成API數(shù)據(jù)包,經(jīng)過打包模塊和壓縮模塊的處理將生成壓縮包。客戶端包括解壓縮模塊、解包模塊和API重放模塊,壓縮包經(jīng)過解壓縮模塊和解包模塊的處理獲得相應(yīng)的API信息,API重放模塊調(diào)用GPU執(zhí)行API并顯示相應(yīng)的圖像。本發(fā)明還提供一種圖像顯示系統(tǒng)和方法,利用本發(fā)明解決現(xiàn)有技術(shù)中記錄與重放API受到特定GPU及應(yīng)用平臺的局限而不具有通用性,以及無法支持實時播放需求的技術(shù)問題。
【專利說明】圖像顯不系統(tǒng)及圖像顯不方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及圖像處理及顯示【技術(shù)領(lǐng)域】,尤其是涉及一種能夠記錄與重放API(Application Programming Interface,應(yīng)用程序編程接口)的圖像顯示系統(tǒng)及圖像顯示方法。
【背景技術(shù)】
[0002]OpenGL ES (OpenGL for Embedded Systems)是免費的跨平臺的 3D 圖形 API(Application Programming Interface,應(yīng)用程序編程接口)標(biāo)準,主要針對手機、平板電腦和游戲主機等嵌入式設(shè)備而設(shè)計。OpenGL ES是從OpenGL裁剪定制而來的,去除了glBegin/glEnd、四邊形(GL_QUADS)、多邊形(GL_P0LYG0NS)等復(fù)雜圖元等許多非絕對必要的特性。經(jīng)過多年發(fā)展,OpenGL ES現(xiàn)在有三個版本,OpenGL ES1.x是針對固定管線硬件的,OpenGL ES2.x針對可編程管線硬件,OpenGL ES3.0于2012年公布,在OpenGL ES2.x基礎(chǔ)上又加入了大量新特性。目前主流嵌入式圖形處理器大都同時支持OpenGL ES1.x與OpenGL ES2.x 標(biāo)準。
[0003]目前,在OpenGL ES標(biāo)準下進行記錄與重放OpenGL ES API在解析應(yīng)用程序、調(diào)試GI3U驅(qū)動、回放游戲畫面以及同屏顯示圖像畫面等場景有著廣泛的應(yīng)用前景,例如,在沒有應(yīng)用程序源碼的情況下可以通過記錄OpenGL ES API進行應(yīng)用程序行為的分析,將一平臺上記錄的OpenGL ES API在另一平臺上重放而實現(xiàn)應(yīng)用程序的安裝以調(diào)試、驗證GPU驅(qū)動,以及在服務(wù)端運行3D應(yīng)用時將OpenGL ES API傳輸?shù)娇蛻舳诉M行相同畫面的顯示以節(jié)省傳輸?shù)膸挕?br> [0004]然而,目前只有部分嵌入式GPU廠商提供了具有記錄與重放API的工具,但是這些工具有以下局限性:(1)記錄API是在GPU驅(qū)動層實現(xiàn),必須支付授權(quán)費獲得GPU廠商的授權(quán)才能使用這些工具;(2)只適用于特定廠商的GPU,不具有通用性;(3) —般情況下只能在一種平臺上使用,跨平臺性欠佳;(4)只能支持非實時的記錄與重放,無法滿足同屏顯示的實時性需求。

【發(fā)明內(nèi)容】

[0005]本發(fā)明實施例所要解決的技術(shù)問題在于,提供一種圖像顯示系統(tǒng)及圖像顯示方法,以解決現(xiàn)有技術(shù)中進行記錄與重放API受到特定GPU及應(yīng)用平臺的局限而不具有通用性,以及無法支持實時播放需求的技術(shù)問題。
[0006]為實現(xiàn)上述目的,本發(fā)明提供一種圖像顯示系統(tǒng),運行一主機裝置中,該圖像顯示系統(tǒng)包括用于執(zhí)行應(yīng)用程序的處理單元以及用于執(zhí)行API以調(diào)用顯示單元顯示相應(yīng)圖像的GPU,其特征在于,該圖像顯示系統(tǒng)還包括服務(wù)端和客戶端,該服務(wù)端包括:
[0007]API重定向模塊,設(shè)置于系統(tǒng)封裝層,用于根據(jù)該處理單元運行應(yīng)用程序時發(fā)出的第一 API重新定向到封裝層中對應(yīng)的第二 API,以及根據(jù)系統(tǒng)設(shè)置判斷是否記錄該第一 API信息。[0008]API記錄模塊,用于當(dāng)該API重定向模塊確定記錄該第一 API信息時對該第一 API信息進行記錄,以及根據(jù)記錄的API信息生成相應(yīng)的一個或多個API數(shù)據(jù)包。
[0009]打包模塊,用于獲取該一個或多個API數(shù)據(jù)包,并將該一個或多個API數(shù)據(jù)包打包組合成一個幀數(shù)據(jù)包。以及
[0010]壓縮模塊,用于使用一壓縮算法將該打包模塊生成的數(shù)據(jù)包進行壓縮以形成相應(yīng)的壓縮包,以及添加相應(yīng)的壓縮協(xié)議信息至該幀數(shù)據(jù)包。
[0011]該客戶端包括:
[0012]解壓縮模塊,用于獲取該壓縮模塊生成的壓縮包,并分析該壓縮包的壓縮協(xié)議信息以得到一個或多個原始幀數(shù)據(jù)包。
[0013]解包模塊,用于獲取該一個或多個原始幀數(shù)據(jù)包,并依次將每個幀數(shù)據(jù)包的頭部信息取出以獲得相應(yīng)的API信息。以及
[0014]API重放模塊,用于按照該解包模塊獲得的API信息調(diào)用該GPU執(zhí)行該API并由顯示單元顯示相應(yīng)的圖像。
[0015]進一步地,本發(fā)明提供的一種圖像顯示方法,該方法包括:
[0016]根據(jù)運行應(yīng)用程序時發(fā)出的第一 API重新定向到封裝層中對應(yīng)的第二 API,以及根據(jù)系統(tǒng)設(shè)置判斷是否記錄該第一 API信息。
[0017]記錄該第一 API 信息。
[0018]將記錄的API信息生成相應(yīng)的API數(shù)據(jù)包。
[0019]將一個或多個該API數(shù)據(jù)包組合成一個幀數(shù)據(jù)包。
[0020]利用一壓縮算法對該數(shù)據(jù)包進行壓縮以形成相應(yīng)的壓縮包,并添加相應(yīng)的壓縮協(xié)議信息至該壓縮包。
[0021]分析該壓縮包的協(xié)議信息以得到一個或多個原始幀數(shù)據(jù)包。
[0022]獲取該一個或多個原始的幀數(shù)據(jù)包,并依次根據(jù)每個數(shù)據(jù)包的壓縮協(xié)議信息獲得每幀中的API信息。以及
[0023]執(zhí)行獲取的該API信息以顯示相應(yīng)的圖像。
[0024]本發(fā)明提供的一種圖像顯示系統(tǒng)和圖像顯示方法,通過服務(wù)端中設(shè)置在封裝層內(nèi)的API重定向單元重定向了系統(tǒng)應(yīng)用的API調(diào)用,并控制記錄API功能的打開和關(guān)閉,并且服務(wù)端將記錄的API信息經(jīng)過打包壓縮后傳送至客戶端進行解包、解壓縮,以此進行API的重放以在客戶端上顯示相應(yīng)的圖像,并且與服務(wù)端顯示的畫面相同。從而,解決現(xiàn)有技術(shù)中進行記錄與重放API受到特定GPU及應(yīng)用平臺的局限而不具有通用性,以及無法支持實時播放需求的技術(shù)問題。
【專利附圖】

【附圖說明】
[0025]圖1為本發(fā)明實施方式中的圖像顯示系統(tǒng)的功能模塊示意圖;
[0026]圖2為本發(fā)明實施方式中的圖像顯示方法的流程圖;
[0027]圖3為本發(fā)明實施方式中的API記錄方法的流程圖。
[0028]標(biāo)號說明:
[0029]圖像顯示系統(tǒng)10
[0030]處理單元11[0031]應(yīng)用程序110
[0032]服務(wù)端20
[0033]API重定向模塊21
[0034]API記錄模塊22
[0035]緩沖存儲區(qū)220
[0036]打包模塊23
[0037]壓縮模塊24
[0038]第一GPU25
[0039]第一顯示單元26
[0040]客戶端30
[0041]解壓縮模塊31 [0042]解包模塊32
[0043]API重放模塊33
[0044]第二GPU34
[0045]第二顯示單元35
【具體實施方式】
[0046]為詳細說明本發(fā)明的技術(shù)內(nèi)容、構(gòu)造特征、所實現(xiàn)目的及效果,以下結(jié)合實施方式并配合附圖詳予說明。
[0047]請參考圖1,為本發(fā)明實施方式中的圖像顯示系統(tǒng)的功能模塊示意圖,該圖像顯示系統(tǒng)10包括處理單元11、服務(wù)端20以及客戶端30。該圖像顯示系統(tǒng)10運行于一個或兩個主機裝置中,該一個或兩個主機裝置可以為便攜式電子裝置,例如便攜式計算機(例如膝上型計算機、筆記本計算機或平板計算機),還可以包括可視媒體播放器、個人數(shù)字助理等,還可以是個人計算機。在本實施方式中,該服務(wù)端20與客戶端30設(shè)置在同一主機裝置中,在其他實施方式中,該服務(wù)端20設(shè)置在一主機裝置中,該客戶端30設(shè)置在另一主機裝置中。
[0048]該處理單元11用于提供處理能力以執(zhí)行操作系統(tǒng)、程序、用戶和應(yīng)用界面、以及圖像顯示系統(tǒng)10的任何其他功能,一應(yīng)用程序110由處理單元11在管理程序中或無管理程序的操作系統(tǒng)中執(zhí)行(操作系統(tǒng)和管理程序在圖中未顯示)。例如,操作系統(tǒng)包含WindowsXP、UNIX、Android等。在本實施方式中,該應(yīng)用程序為OpenGL ES1.X,在其他實施方式中,該應(yīng)用程序還可以是OpenGL ES2.x或OpenGL ES3.X。
[0049]該服務(wù)端20包括API重定向模塊21、API記錄模塊22、打包模塊23、壓縮模塊24、第一 GPU (Graphic Processing Unit,圖形處理單元)25以及第一顯示單元26。在本實施方式中,該API重定向模塊21為OpenGL ESl.x API重定向模塊,在其他實施方式中,該API重定向模塊21還可以是OpenGL ES2.x API重定向模塊或OpenGL ES3.x API重定向模塊。該API重定向模塊21設(shè)置于系統(tǒng)封裝層,用于根據(jù)處理單元11運行應(yīng)用程序110時發(fā)出的第一 API重新定向到封裝層中對應(yīng)的第二 API,以及根據(jù)系統(tǒng)設(shè)置判斷是否記錄該第一 API信息。具體地,以glDrawArrays這個API為例,應(yīng)用程序調(diào)用glDrawArrays后,封裝層并不是直接調(diào)用到GPU驅(qū)動的glDrawArrays函數(shù),而是由API重定向模塊23調(diào)用到封裝層中與glDrawArrays對應(yīng)的gIDrawArraysWrap函數(shù)。該API重定向模塊21在gIDrawArraysffrap中判斷是否需要記錄下對應(yīng)的API信息參數(shù),如果不需要記錄,則直接調(diào)用GPU驅(qū)動的glDrawArrays函數(shù);如果需要記錄,則除了調(diào)用GPU驅(qū)動的glDrawArrays函數(shù)外,還要記錄下glDrawArrays的參數(shù)。
[0050]在本實施方式中,根據(jù)OpenGL ESl.x API的功能,將API分成5類,包括:設(shè)置狀態(tài)AP1、查詢狀態(tài)AP1、緩沖區(qū)數(shù)據(jù)與紋理數(shù)據(jù)AP1、頂點屬性數(shù)組API以及繪制圖元API。其中,設(shè)置狀態(tài)API用于對OpenGL ES1.x的狀態(tài)變量進行渲染,該狀態(tài)變量包括顏色、頂點坐標(biāo)、深度、視點和投影變換、紋理映射、光照和材質(zhì)等。查詢狀態(tài)API用于對OpenGL ES1.x的當(dāng)前狀態(tài)進行查詢,以及將當(dāng)前幀緩沖中的像素數(shù)據(jù)反饋至GPU以供應(yīng)用程序使用,其包括glGet*和glls*。緩沖區(qū)數(shù)據(jù)與紋理數(shù)據(jù)API的輸入?yún)?shù)中包括指向大量數(shù)據(jù)的指針,其包括 glBufferData、glBufferSubData、glCompressedTexImage2D>glCompressedTexSubImage2D、glTexImage2D、以及 glTexSubImage2D。頂點屬性數(shù)組API用于標(biāo)識頂點屬性,頂點屬性包括顏色、法線、紋理坐標(biāo)和頂點坐標(biāo),這類API包括glColorPointer、glNormalPointer> glTexCoordPointer 和 glVertexPointer。繪制圖兀API包括glDrawArrays和glDrawElements,用于指定將要繪制的圖元的類型和參與繪制的頂點,并向GPU發(fā)出繪制的命令,GPU根據(jù)此時的OpenGL ES1.x的狀態(tài)進行渲染。
[0051]API信息包括API名稱、上下文(context)、輸入?yún)?shù)、還可以包括API返回值。當(dāng)該API重定向模塊21根據(jù)重新定向的API確定進行記錄API信息時產(chǎn)生相應(yīng)的控制信號,該API記錄模塊22用于響應(yīng)該控制信號對該第一 API信息進行記錄,具體包括:該API記錄模塊22依次記錄該第一 API信息中的函數(shù)名稱、上下文以及輸入?yún)?shù),以及判斷該第一API信息中是否具有數(shù)據(jù)指針。當(dāng)確定該第一 API信息中具有數(shù)據(jù)指針時該API記錄模塊22復(fù)制指針?biāo)赶虻臄?shù)據(jù)并調(diào)用第一 GPU25執(zhí)行該第一 API,當(dāng)確定該API信息中不具有數(shù)據(jù)指針時直接調(diào)用第一 GPU25執(zhí)行該第一 API。當(dāng)?shù)谝?GPU25執(zhí)行該第一 API完成時,該API記錄模塊22還判斷第一 GPU25執(zhí)行該第一 API后是否產(chǎn)生返回值,并當(dāng)確定產(chǎn)生返回值時該API記錄模塊22將該返回值記錄下來。該API記錄模塊22還根據(jù)該第一 API信息判斷是否需要進行特殊處理,以及將經(jīng)過特殊處理或未經(jīng)過特殊處理的記錄的API信息以API數(shù)據(jù)包的形式存儲到緩沖存儲區(qū)220中。在本實施方式中,該API記錄模塊22以添加相應(yīng)的glMsg到緩沖存儲區(qū)220中的方式進行API的記錄。
[0052]以在運行應(yīng)用程序為OpenGL ES1.x的情況下記錄API信息為例進行具體說明:該API記錄模塊22用連續(xù)的正整數(shù)表示記錄的API名稱,且每個API與一個數(shù)字對應(yīng)。每個上下文代表一個獨立的可視的繪圖區(qū)域,且存儲了一個OpenGL ES1.x實例的所有狀態(tài),該API記錄模塊22用正整數(shù)標(biāo)識上下文,且每個上下文與一個數(shù)字對應(yīng)。該API記錄模塊22根據(jù)OpenGL ES1.x標(biāo)準中的API原型依次記錄API的輸入?yún)?shù),具體地,對于類型為向量形式的API記錄向量的所有分量,對于類型為數(shù)據(jù)指針的輸入?yún)?shù)首先記錄數(shù)據(jù)長度,然后記錄指針?biāo)赶虻臄?shù)據(jù)內(nèi)容。記錄數(shù)據(jù)的長度是便于在接下來的流程中復(fù)制數(shù)據(jù),統(tǒng)計glMsg的總大小,以及當(dāng)數(shù)據(jù)長度為O時可以表示數(shù)據(jù)指針是空指針或是在緩沖區(qū)數(shù)據(jù)中的偏移量。當(dāng)調(diào)用GPU驅(qū)動執(zhí)行完API后,該API記錄模塊22記錄下具有返回值的API對應(yīng)的返回值。
[0053]本發(fā)明根據(jù)API信息可以將API劃分為三類,包括只需要依次記錄下完整信息的AP1、不需要記錄信息的API以及需要特殊處理的API。[0054]在本實施方式中,不需要記錄的API包括查詢狀態(tài)的AP1、glGenBuffers以及glGenTextures。具體地,查詢記錄的API的作用在于反饋OpenGL ESl.x的當(dāng)前狀態(tài)以便執(zhí)行的應(yīng)用程序110選擇下一步操作,并沒有直接參與繪圖操作,客戶端30只需要顯示出與服務(wù)端20相同的畫面,并不需要去選擇應(yīng)用程序的運行路徑。因此,本發(fā)明中服務(wù)端20不記錄查詢狀態(tài)的API。glGenBuffers以及glGenTextures用于生成一個或多個對象(緩沖區(qū)對象或紋理對象)名稱,但是在服務(wù)端20和客戶端30執(zhí)行同樣API時生成的對象名稱并不一定相同,其取決于GPU驅(qū)動對OpenGL ESL x的實現(xiàn)。OpenGL ESL x允許不通過預(yù)先生成對象名稱能夠在執(zhí)行綁定操作(glBindBuffer、glBindTexture)和刪除操作(glDeleteBuffers、glDeleteTextures)中使用這個對象名稱。如果服務(wù)端20的部分對象名稱是調(diào)用API生成的,另一部分對象名稱是直接綁定的,就會造成客戶端30管理對象名稱的混亂,使得API無法得到正確地執(zhí)行。因此,本發(fā)明的服務(wù)端20負責(zé)管理全部的對象名稱,客戶端30不生成對象名稱,只是執(zhí)行與服務(wù)端20相同的綁定操作和刪除操作,保證服務(wù)端20與客戶端30的對象名稱是一一對應(yīng)的,服務(wù)端20可以確保對象名稱的正確使用。因此,服務(wù)端20不記錄glGenBuffers和glGenTextures這兩個API。
[0055]在本實施方式中,需要進行特殊處理的API包括頂點屬性數(shù)組AP1、繪制圖元AP1、glBufferData 以及 glBufferSubData。具體地,glColorPointer、glNormalPointer>glTexCoordPointer和glVertexPointer這四個API的輸入?yún)?shù)中都有一個指向?qū)傩詳?shù)據(jù)的指針。在沒有綁定頂點屬性緩沖區(qū)的情況下,參與繪制的頂點直到glDrawArrays或glDrawElements時才能確定,而在調(diào)用頂點屬性數(shù)組API時無法記錄下繪圖所需要的頂點屬性數(shù)據(jù)。因此,對于沒有綁定頂點屬性緩沖區(qū)的頂點屬性數(shù)組API進行的特殊處理包括:在調(diào)用未綁定頂點屬性緩沖區(qū)的頂點屬性數(shù)組API時,將除了頂點屬性數(shù)據(jù)之外的參數(shù)記錄在glMsg中;對于glTexCoordPointer函數(shù),在glMsg中額外增加一個參數(shù)記錄當(dāng)前綁定的紋理單元;不完整的glMsg被添加到隊列中而不是記錄緩沖區(qū)中。
[0056]繪制圖兀API包括glDrawArrays和glDrawElements,其函數(shù)原型如下:glDrawArrays (GLenum mode、GLint first、GLsizei count), glDrawElements (GLenummode、GLsizei count、GLenum type、const GLvoid*indices),用于設(shè)置圖兀的類型(輸入?yún)?shù)mode)、參與繪制的頂點索引的數(shù)目(輸入?yún)?shù)count)以及索引。其中,glDrawArrays的頂點起始索引是輸入?yún)?shù)first,隨后的連續(xù)count-Ι個頂點參與繪制,glDrawElements的輸入?yún)?shù)indices指向存放頂點索引的數(shù)組。由于頂點屬性數(shù)組API在沒有綁定頂點屬性緩沖區(qū)對象的情況下被“緩存”,執(zhí)行g(shù)lDrawArrays和glDrawElements時需要在記錄API時的特殊處理包括:從隊列中依次取出緩存的頂點屬性數(shù)組API的glMsg,此時參與繪圖的頂點已經(jīng)確定,在原先的glMsg的基礎(chǔ)上將參與繪圖的頂點屬性數(shù)據(jù)記錄下來,構(gòu)成一個完整的glMsg,添加到記錄緩沖區(qū)中;執(zhí)行g(shù)lDrawArrays或glDrawElements結(jié)束后,清空隊列。應(yīng)用程序110可能一次在一塊內(nèi)存中傳入了所有頂點的屬性數(shù)據(jù),但是每次參與繪制的頂點只是其中的一部分,客戶端30只需要參與繪制的那部分頂點的屬性數(shù)據(jù)就可以正確繪圖。在本實施方式中,該服務(wù)端20只對必須的頂點屬性數(shù)據(jù)進行記錄。具體地,glDrawArrays其參與繪制的頂點索引是連續(xù)的,只需要將索引從first開始的連續(xù)count個頂點的屬性數(shù)據(jù)記錄下來,glDrawElements的輸入?yún)?shù)indices指向的索引數(shù)組中的索引是沒有規(guī)律的,數(shù)組中也可能有重復(fù)的索引,因此找出參與繪制的索引的最小和最大值,并將最小索引和最大索引之間的那部分頂點的屬性數(shù)據(jù)記錄下來。
[0057]glBufferData 和 glBufferSubData 這兩個 API 的函數(shù)原型為 voidglBufferData(GLenum target、GLsizeiptr size、 const GLvoid*data、 GLenumusage) ; void glBufferSubData (GLenum target、GLintptr offset、GLsizeiptr size、const GLvoid*data)。當(dāng)頂點屬性數(shù)組API沒有綁定頂點屬性緩沖區(qū)對象時需要在執(zhí)行g(shù)lDrawElements時找出參與繪圖的頂點索引的最大值和最小值,當(dāng)應(yīng)用程序為glDrawElements的索引數(shù)組綁定索引緩沖區(qū),由于索引緩沖區(qū)中的內(nèi)容存儲在GPU的內(nèi)存中,此時服務(wù)端無法訪問到這些索引數(shù)據(jù)。因此,對glBufferData和glBufferSubData執(zhí)行的特殊處理包括:在上下文中為每個索引緩沖區(qū)對象分配一塊相同大小的備份索引緩沖區(qū),該備份索弓I緩沖區(qū)的內(nèi)容是服務(wù)端可以訪問到的。在glBufferData/glBufferSubData更新數(shù)據(jù)到索引緩沖區(qū)的同時將數(shù)據(jù)更新到對應(yīng)的備份索引緩沖區(qū),使得備份索引緩沖區(qū)中的數(shù)據(jù)與索引緩沖區(qū)保持一致。在記錄glDrawElements的過程中就可以在備份索引緩沖區(qū)中查找索引的最大值和最小值,并且備份索引緩沖區(qū)隨著索引緩沖區(qū)銷毀而銷毀。
[0058]該API記錄模塊22將記錄API信息生成相應(yīng)的API數(shù)據(jù)包,并將API數(shù)據(jù)包存儲到緩沖存儲區(qū)220中。該打包模塊23用于將緩沖存儲區(qū)220中存儲的多個API數(shù)據(jù)包進行組合打包并發(fā)送至壓縮模塊24。在本實施方式中,該打包模塊23將多個API數(shù)據(jù)包組合成一個幀數(shù)據(jù)包,具體地,該打包模塊23將API記錄模塊22輸出的API數(shù)據(jù)包不斷地累加到幀數(shù)據(jù)包中,在一幀結(jié)束后再將幀數(shù)據(jù)包發(fā)送給壓縮模塊24。進一步地,該打包模塊23還判斷當(dāng)前幀數(shù)據(jù)包的大小是否超過一個閾值,若確定當(dāng)前幀數(shù)據(jù)包的大小超過該閾值時則無論這一幀是否結(jié)束,都將當(dāng)前的幀數(shù)據(jù)包發(fā)送至壓縮模塊24,并將該幀剩余的API數(shù)據(jù)包再組成一個或多個新的幀數(shù)據(jù)包。
[0059]該壓縮模塊24用于使用一壓縮算法對接收到的數(shù)據(jù)包進行壓縮,以及添加相應(yīng)的壓縮協(xié)議信息。在本實施方式中,該壓縮模塊24以打包模塊23輸出的一個數(shù)據(jù)包作為單位進行數(shù)據(jù)包壓縮,上述壓縮算法包括通用壓縮算法(General Compression)和差量壓縮算法(Delta Compression),若當(dāng)前API數(shù)據(jù)包和上一個API數(shù)據(jù)包相似程度較高,該壓縮模塊24使用差量壓縮算法對當(dāng)前API數(shù)據(jù)包進行壓縮以獲得較高壓縮比,若當(dāng)前API數(shù)據(jù)包和上一個API數(shù)據(jù)包的相關(guān)性較弱,則該壓縮模塊24使用通用壓縮算法對當(dāng)前API數(shù)據(jù)包進行壓縮。在對API數(shù)據(jù)包進行壓縮后,該壓縮模塊24還用于在獲得的壓縮包的頭部加入壓縮協(xié)議信息,其中,該壓縮協(xié)議信息包括壓縮后數(shù)據(jù)包的校驗值、壓縮類型、壓縮前的數(shù)據(jù)量以及壓縮后的數(shù)據(jù)量。
[0060]該客戶端30包括解壓縮模塊31、解包模塊32、API重放模塊33、第二 GPU34以及第二顯示單元35。當(dāng)服務(wù)端20完成API數(shù)據(jù)包的壓縮并將壓縮包傳送至客戶端30時,該客戶端30的解壓縮模塊31用于分析接收到的壓縮包的協(xié)議信息頭以得到原始的幀數(shù)據(jù)包,具體地,該解壓縮模塊31通過校驗值校驗數(shù)據(jù)以保證數(shù)據(jù)的正確性,根據(jù)壓縮后的數(shù)據(jù)量將數(shù)據(jù)流以壓縮包為單位分割出來,根據(jù)壓縮前的數(shù)據(jù)量分配內(nèi)存給解壓后的幀數(shù)據(jù)包,以及根據(jù)壓縮類型進行相應(yīng)地解壓,得到原始的幀數(shù)據(jù)包。
[0061]該解包模塊32用于獲取解壓縮模塊31處理得到的原始的幀數(shù)據(jù)包,取出一個API數(shù)據(jù)包的頭部,獲得該API的glMsg的數(shù)據(jù)長度信息,以及將該API的參數(shù)信息送至API重放模塊33,該解包模塊32依照上述處理過程直至處理完所有API數(shù)據(jù)包。[0062]該API重放模塊33按照解包模塊32發(fā)送的API參數(shù)調(diào)用第二 GPU34執(zhí)行該API,并由第二顯示單元35顯示相應(yīng)的圖像信息。在本實施方式中,需要特殊處理的API包括輸入?yún)?shù)包含數(shù)據(jù)指針的AP1、頂點屬性數(shù)組API以及glScissor與glViewport。
[0063]具體地,服務(wù)端20對于輸入?yún)?shù)包含數(shù)據(jù)指針的API并沒有記錄應(yīng)用程序設(shè)定的數(shù)據(jù)指針,而是記錄了數(shù)據(jù)的長度和數(shù)據(jù)的內(nèi)容。因此,在客戶端30重放對應(yīng)的API時,該API重放模塊33將輸入?yún)?shù)中的數(shù)據(jù)指針設(shè)置為指向服務(wù)端20傳送過來的數(shù)據(jù)內(nèi)容。對于綁定了頂點屬性緩沖區(qū)的頂點屬性數(shù)組API,API重放模塊33回放服務(wù)端20傳送過來的參數(shù)。對于未綁定頂點屬性緩沖區(qū)的頂點屬性數(shù)組API,服務(wù)端20在緩存這些API后記錄相應(yīng)的API信息,該API重放模塊33在回放未綁定頂點屬性緩沖區(qū)的頂點屬性數(shù)組API之前執(zhí)行g(shù)lBindBuffer (GL_ARRAY_BUFFER,O)以解除綁定頂點屬性緩沖區(qū),在回放API完成之后執(zhí)行g(shù)lBindBuffer (GL_ARRAY_BUFFER,curbuf)以重新綁定此時上下文的頂點屬性緩沖區(qū)。glTexCoordPointer與紋理單元相關(guān),在服務(wù)端20,未綁定定點屬性緩沖區(qū)的glTexCoordPointer被延后記錄,以及增加額外的參數(shù)記錄當(dāng)時綁定的紋理單元(記為X)。在客戶端30回放未綁定頂點屬性緩沖區(qū)的glTexCoordPointer之前執(zhí)行g(shù)lClientActiveTexture (X)以設(shè)置當(dāng)時的紋理單元,并在回放后執(zhí)行g(shù)lClientActiveTexture (Y)以重新綁定此時上下文的紋理單元(Y)。glScissor與glViewport 的原型分別為 void glScissor (GLint x, GLint y, GLsizei width, GLsizeiheight)和 void glViewport (GLint x, GLint y, GLsizei width, GLsizei height)。由于服務(wù)端20與客戶端30的屏幕分辨率可能不同,客戶端30在重放glScissor與glViewport時要做適應(yīng)屏幕分辨率的調(diào)整,具體包括:設(shè)置服務(wù)端的分辨率為(Ws,Hs),客戶端的分辨率為(Wc,Hc),計算寬比例因子為Fw=Wc/Ws,高比例因子Fh=Hc/Hs。對API中的輸入X,y, width, height參數(shù)分別做如下處理:
[0064]X1 =(GLint) (x*Fw+0.5f);
[0065]y' =(GLint) (y*Fh+0.5f);
[0066]width' =(GLsizei) (width*Fw+0.5f);
[0067]height1 =(GLsizei) (height*Fh+0.5f);
[0068]將調(diào)整后的f ,y1 , width; ,height’作為新的輸入?yún)?shù)傳給第二 GPU34以驅(qū)動第二顯示單元35進行相應(yīng)圖像的顯示。
[0069]請參閱圖2,為本發(fā)明實施方式中的圖像顯示方法的流程圖,該方法包括:
[0070]步驟S40,該API重定向模塊21根據(jù)處理單元11運行應(yīng)用程序110時發(fā)出的第一API重新定向到封裝層中對應(yīng)的第二API,以及根據(jù)系統(tǒng)設(shè)置判斷是否記錄該第一API信息。若是,則進入步驟S41,否則,繼續(xù)執(zhí)行步驟S40。
[0071]其中,該API重定向模塊21設(shè)置于系統(tǒng)封裝層中。
[0072]步驟S41,該API記錄模塊22響應(yīng)API重定向模塊21的調(diào)用對該第一 API信息進行記錄。其中,API信息包括API名稱、上下文(context)、輸入?yún)?shù)、還可以包括API返回值。
[0073]請同時參閱圖3,為本發(fā)明實施方式中的API記錄方法的流程圖,該方法包括:
[0074]步驟S410,該API記錄模塊22依次記錄該第一 API信息中的函數(shù)名稱、上下文以及輸入?yún)?shù)。[0075]以在運行應(yīng)用程序為OpenGL ES1.x的情況下記錄API信息為例進行具體說明:該API記錄模塊22用連續(xù)的正整數(shù)表示記錄的API名稱,且每個API與一個數(shù)字對應(yīng)。每個上下文代表一個獨立的可視的繪圖區(qū)域,且存儲了一個OpenGL ES1.x實例的所有狀態(tài),該API記錄模塊22用正整數(shù)標(biāo)識上下文,且每個上下文與一個數(shù)字對應(yīng)。該API記錄模塊22根據(jù)OpenGL ES1.x標(biāo)準中的API原型依次記錄API的輸入?yún)?shù),具體地,對于類型為向量形式的API記錄向量的所有分量,對于類型為數(shù)據(jù)指針的輸入?yún)?shù)首先記錄數(shù)據(jù)長度,然后記錄指針?biāo)赶虻臄?shù)據(jù)內(nèi)容。
[0076]步驟S411,該API記錄模塊22判斷該第一 API信息中是否具有數(shù)據(jù)指針,若是,則進入步驟S412,否則,進入步驟S413。
[0077]步驟S412,該API記錄模塊22復(fù)制指針?biāo)赶虻臄?shù)據(jù)。
[0078]步驟S413,該第一 GPU25獲取并執(zhí)行該第一 API以驅(qū)動第一顯示單元26顯示相應(yīng)的圖像。
[0079]步驟S414,該API記錄模塊22判斷第一 GPU25執(zhí)行該第一 API完成后是否產(chǎn)生返回值,若是,則進入步驟S415,否則,進入步驟S416。
[0080]步驟S415,該API記錄模塊22記錄該第一 API執(zhí)行完成后產(chǎn)生的返回值。
[0081]步驟S416,該API記錄模塊22根據(jù)該第一 API信息判斷是否對該第一 API進行特殊處理,若是,則進入步驟S417,否則,本流程結(jié)束。
[0082]步驟S417,該API記錄模塊22根據(jù)第一 API信息對該第一 API進行特殊處理。然后,本流程結(jié)束。
[0083]本發(fā)明根據(jù)API信息可以將API劃分為三類,包括只需要依次記錄下完整信息的AP1、不需要記錄信息的API以及需要特殊處理的API。在本實施方式中,不需要記錄的API包括查詢狀態(tài)的AP1、glGenBuffers以及glGenTextures,需要進行特殊處理的API包括頂點屬性數(shù)組 AP1、繪制圖元 AP1、glBufferData 以及 glBufferSubData。
[0084]對于沒有綁定頂點屬性緩沖區(qū)的頂點屬性數(shù)組API進行的特殊處理包括:在調(diào)用未綁定頂點屬性緩沖區(qū)的頂點屬性數(shù)組API時,將除了頂點屬性數(shù)據(jù)之外的參數(shù)記錄在glMsg中;對于glTexCoordPointer函數(shù),在glMsg中額外增加一個參數(shù)記錄當(dāng)前綁定的紋理單元;不完整的glMsg被添加到隊列中而不是記錄緩沖區(qū)中。
[0085]當(dāng)頂點屬性數(shù)組API沒有綁定頂點屬性緩沖區(qū)時,執(zhí)行繪制圖元API中的glDrawArrays和glDrawElements需要進行的特殊處理包括:從隊列中依次取出緩存的頂點屬性數(shù)組API的glMsg,此時參與繪圖的頂點已經(jīng)確定,在原先的glMsg的基礎(chǔ)上將參與繪圖的頂點屬性數(shù)據(jù)記錄下來,構(gòu)成一個完整的glMsg,添加到記錄緩沖區(qū)中;執(zhí)行g(shù)lDrawArrays 或 glDrawElement 結(jié)束后,清空隊列。
[0086]當(dāng)頂點屬性數(shù)組API沒有綁定頂點屬性緩沖區(qū)時需要在執(zhí)行g(shù)lDrawElements時找出參與繪圖的頂點索引的最大值和最小值,當(dāng)應(yīng)用程序為glDrawElements的索引數(shù)組綁定了索引緩沖區(qū)時,對glBufferData和glBufferSubData執(zhí)行的特殊處理包括:在上下文中為每個索引緩沖區(qū)對象分配一塊相同大小的備份索引緩沖區(qū);在glBufferData/glBufferSubData更新數(shù)據(jù)到索引緩沖區(qū)的同時將數(shù)據(jù)更新到對應(yīng)的備份索引緩沖區(qū),使得備份索引緩沖區(qū)中的數(shù)據(jù)與索引緩沖區(qū)保持一致。在記錄glDrawElements的過程中在備份索引緩沖區(qū)中查找索引的最大值和最小值,并且備份索引緩沖區(qū)隨著索引緩沖區(qū)銷毀而銷毀。
[0087]步驟S42,該API記錄模塊22將記錄API信息生成相應(yīng)的API數(shù)據(jù)包,并將API數(shù)據(jù)包存儲到緩沖存儲區(qū)220中。
[0088]在本實施方式中,該API記錄模塊22以添加相應(yīng)的glMsg到緩沖存儲區(qū)220中的方式進行API的記錄。
[0089]步驟S43,該打包模塊23將緩沖存儲區(qū)220中存儲的多個API數(shù)據(jù)包組合成相應(yīng)的幀數(shù)據(jù)包并發(fā)送至壓縮模塊24。
[0090]在本實施方式中,該打包模塊23還判斷當(dāng)前的幀數(shù)據(jù)包的大小是否超過一個閾值,若確定當(dāng)前幀數(shù)據(jù)包的大小超過該閾值時則無論這一幀是否結(jié)束,都將當(dāng)前的幀數(shù)據(jù)包發(fā)送至壓縮模塊24,并將該幀剩余的API數(shù)據(jù)包再組成一個或多個新的幀數(shù)據(jù)包。
[0091]步驟S44,該壓縮模塊24使用一壓縮算法對接收到的幀數(shù)據(jù)包進行壓縮,添加相應(yīng)的壓縮協(xié)議信息,以及將壓縮包發(fā)送至客戶端30。
[0092]在本實施方式中,該壓縮模塊24以打包模塊23輸出的一個數(shù)據(jù)包作為單位進行數(shù)據(jù)包壓縮,上述壓縮算法包括通用壓縮算法(General Compression)和差量壓縮算法(Delta Compression),若當(dāng)前API數(shù)據(jù)包和上一個API數(shù)據(jù)包相似程度較高,該壓縮模塊24使用差量壓縮算法對當(dāng)前API數(shù)據(jù)包進行壓縮以獲得較高壓縮比,若當(dāng)前API數(shù)據(jù)包和上一個API數(shù)據(jù)包的相關(guān)性較弱,則該壓縮模塊24使用通用壓縮算法對當(dāng)前API數(shù)據(jù)包進行壓縮。
[0093]在對API數(shù)據(jù)包進行壓縮后,該壓縮模塊24在獲得的壓縮包的頭部加入壓縮協(xié)議信息,其中,該壓縮協(xié)議信息包括壓縮后數(shù)據(jù)包的校驗值、壓縮類型、壓縮前的數(shù)據(jù)量以及壓縮后的數(shù)據(jù)量。
[0094]步驟S45,該解壓縮模塊31分析接收到的壓縮包的協(xié)議信息頭以得到原始的幀數(shù)據(jù)包,具體地,該解壓縮模塊31通過校驗值校驗數(shù)據(jù)以保證數(shù)據(jù)的正確性,根據(jù)壓縮后的數(shù)據(jù)量將數(shù)據(jù)流以壓縮包為單位分割出來,根據(jù)壓縮前的數(shù)據(jù)量分配內(nèi)存給解壓后的幀數(shù)據(jù)包,以及根據(jù)壓縮類型進行相應(yīng)地解壓,得到原始的幀數(shù)據(jù)包。
[0095]步驟S46,該解包模塊32用于獲取解壓縮模塊31處理得到的原始的幀數(shù)據(jù)包,取出一個API數(shù)據(jù)包的頭部以獲得該API的glMsg的數(shù)據(jù)長度信息,以及將該API的參數(shù)信息發(fā)送至API重放模塊33,該解包模塊32依照上述處理過程直至處理完所有的API數(shù)據(jù)包。
[0096]步驟S47,該API重放模塊33按照解包模塊32發(fā)送的API參數(shù)調(diào)用第二 GPU34執(zhí)行該API,以驅(qū)動第二顯示單元35顯示相應(yīng)的圖像信息。其中,該第二顯示單元35顯示的圖像與第一顯示單元26顯示的圖像相同,即客戶端30顯示的圖像與服務(wù)端20顯示的圖像相同。
[0097]在本實施方式中,需要特殊處理的API包括輸入?yún)?shù)包含數(shù)據(jù)指針的AP1、頂點屬性數(shù)組 API 以及 glScissor 與 glViewport。
[0098]具體地,服務(wù)端20對于輸入?yún)?shù)包含數(shù)據(jù)指針的API并沒有記錄應(yīng)用程序設(shè)定的數(shù)據(jù)指針,而是記錄了數(shù)據(jù)的長度和數(shù)據(jù)的內(nèi)容。因此,在客戶端30重放對應(yīng)的API時,該API重放模塊33將輸入?yún)?shù)中的數(shù)據(jù)指針設(shè)置為指向服務(wù)端20傳送過來的數(shù)據(jù)內(nèi)容。對于綁定了頂點屬性緩沖區(qū)的頂點屬性數(shù)組API,API重放模塊33回放服務(wù)端20傳送過來的參數(shù)。對于未綁定頂點屬性緩沖區(qū)的頂點屬性數(shù)組API,服務(wù)端20在緩存該些API后記錄相應(yīng)的API信息,該API重放模塊33在回放未綁定頂點屬性緩沖區(qū)的頂點屬性數(shù)組API之前執(zhí)行g(shù)lBindBuffer (GL_ARRAY_BUFFER,O)以解除綁定頂點屬性緩沖區(qū),在回放API完成之后執(zhí)行g(shù)lBindBuffer (GL_ARRAY_BUFFER,curbuf)以重新綁定此時上下文的頂點屬性緩沖區(qū)。glTexCoordPointer與紋理單元相關(guān),在服務(wù)端20,未綁定定點屬性緩沖區(qū)的glTexCoordPointer被延后記錄,以及增加額外的參數(shù)記錄當(dāng)時綁定的紋理單元(記為X)。在客戶端30回放未綁定頂點屬性緩沖區(qū)的glTexCoordPointer之前執(zhí)行g(shù)lClientActiveTexture (X)以設(shè)置當(dāng)時的紋理單元,并在回放后執(zhí)行g(shù)lClientActiveTexture (Y)以重新綁定此時上下文的紋理單元(Y)。glScissor與glViewport 的原型分別為 void glScissor (GLint x, GLint y, GLsizei width, GLsizeiheight)和 void glViewport (GLint x, GLint y, GLsizei width, GLsizei height)。由于服務(wù)端20與客戶端30的屏幕分辨率可能不同,客戶端30在重放glScissor與glViewport時要做適應(yīng)屏幕分辨率的調(diào)整,具體包括:設(shè)置服務(wù)端的分辨率為(Ws,Hs),客戶端的分辨率為(Wc,Hc),計算寬比例因子為Fw=Wc/Ws,高比例因子Fh=Hc/Hs。對API中的輸入X,y, width, height參數(shù)分別做如下處理:
[0099]X' =(GLint) (x*Fw+0.5f);
[0100]j' =(GLint) (y*Fh+0.5f);
[0101]width' =(GLsizei) (width*Fw+0.5f);
[0102]height' = (GLsizei) (height*Fh+0.5f);
[0103]將調(diào)整后的f ,j' , width; , height;作為新的輸入?yún)?shù)傳給第二 GPU34以驅(qū)動第二顯示單元35進行相應(yīng)圖像的顯示。
[0104]本發(fā)明提供的一種圖像顯示系統(tǒng)和圖像顯示方法,通過服務(wù)端中設(shè)置在封裝層內(nèi)的API重定向單元重定向了系統(tǒng)應(yīng)用的API調(diào)用,并控制記錄API功能的打開和關(guān)閉,并且服務(wù)端將記錄的API信息經(jīng)過打包壓縮后傳送至客戶端進行解包、解壓縮,以此進行API的重放以在客戶端上顯示相應(yīng)的圖像,并且與服務(wù)端顯示的畫面相同。從而,解決現(xiàn)有技術(shù)中進行記錄與重放API受到特定GPU及應(yīng)用平臺的局限而不具有通用性,以及無法支持實時播放需求的技術(shù)問題。
[0105]以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運用在其他相關(guān)的【技術(shù)領(lǐng)域】,均同理包括在本發(fā)明的專利保護范圍內(nèi)。
【權(quán)利要求】
1.一種圖像顯示系統(tǒng),運行一主機裝置中,所述圖像顯示系統(tǒng)包括用于執(zhí)行應(yīng)用程序的處理單元以及用于執(zhí)行API以調(diào)用顯示單元顯示相應(yīng)圖像的GPU,其特征在于,所述圖像顯示系統(tǒng)還包括服務(wù)端和客戶端,所述服務(wù)端包括: API重定向模塊,設(shè)置于系統(tǒng)封裝層,用于根據(jù)所述處理單元運行應(yīng)用程序時發(fā)出的第一 API重新定向到封裝層中對應(yīng)的第二 API,以及根據(jù)系統(tǒng)設(shè)置判斷是否記錄所述第一 API信息; API記錄模塊,用于當(dāng)所述API重定向模塊確定記錄所述第一 API信息時對所述第一API信息進行記錄,以及根據(jù)記錄的API信息生成相應(yīng)的一個或多個API數(shù)據(jù)包; 打包模塊,用于獲取所述一個或多個API數(shù)據(jù)包,并將所述一個或多個API數(shù)據(jù)包打包組合成一個幀數(shù)據(jù)包; 以及壓縮模塊,用于使用一壓縮算法將所述幀數(shù)據(jù)包進行壓縮以形成相應(yīng)的壓縮包,以及添加相應(yīng)的壓縮協(xié)議信息至所述壓縮包; 所述客戶端包括: 解壓縮模塊,用于獲取所述壓縮模塊生成的壓縮包,并分析所述壓縮包的壓縮協(xié)議信息以得到一個或多個原始幀數(shù)據(jù)包; 解包模塊,用于獲取所述一個或多個原始幀數(shù)據(jù)包,并依次根據(jù)每個幀數(shù)據(jù)包的壓縮協(xié)議信息獲得相應(yīng)的API信息; 以及API重放模塊,用于按照所述解包模塊獲得的API信息調(diào)用所述GPU執(zhí)行所述API并由顯示單元顯示相應(yīng)的圖像。
2.如權(quán)利要求1所述的圖像顯示系統(tǒng),其特征在于,所述服務(wù)端設(shè)置在所述第一主機裝置中,所述客戶端設(shè)置在所述第二主機裝置。
3.如權(quán)利要求1所述的圖像顯示系統(tǒng),其特征在于,所述API信息包括API名稱、上下文、輸入?yún)?shù)以及API返回值;所述API記錄模塊記錄所述第一 API信息以及根據(jù)記錄的API信息生成相應(yīng)的一個或多個API數(shù)據(jù)包,包括: 所述API記錄模塊依次記錄所述第一 API信息中的API名稱、上下文和輸入?yún)?shù),以及判斷所述第一 API信息中是否具有數(shù)據(jù)指針; 當(dāng)確定所述第一 API信息中具有數(shù)據(jù)指針時所述API記錄模塊復(fù)制指針?biāo)赶虻臄?shù)據(jù)并調(diào)用所述服務(wù)端的GPU執(zhí)行所述第一 API以在服務(wù)端的顯示單元上顯示相應(yīng)圖像,當(dāng)確定所述API信息中不具有數(shù)據(jù)指針時直接調(diào)用所述服務(wù)端的GPU執(zhí)行所述第一 API以在所述服務(wù)端的顯示單元上顯示相應(yīng)圖像; 當(dāng)所述服務(wù)端的GPU執(zhí)行所述第一 API完成時,所述API記錄模塊還判斷執(zhí)行所述第一 API完成后是否產(chǎn)生返回值,并當(dāng)確定產(chǎn)生返回值時所述API記錄模塊記錄所述返回值; 以及所述API記錄模塊還判斷所述第一 API是否為需要進行特殊處理的API,以及將經(jīng)過特殊處理或未經(jīng)過特殊處理的記錄的API信息以API數(shù)據(jù)包的形式存儲到所述服務(wù)端的緩沖存儲區(qū)中。
4.如權(quán)利要求3所述的圖像顯示系統(tǒng),其特征在于,所述應(yīng)用程序為OpenGLESl.x,K述API記錄模塊依次記錄所述第一 API信息中的API名稱、上下文和輸入?yún)?shù),包括: 所述API記錄模塊用連續(xù)的正整數(shù)表示記錄的API名稱,且每個API與一個數(shù)字對應(yīng);所述API記錄模塊用正整數(shù)標(biāo)識上下文,且每個上下文與一個數(shù)字對應(yīng);所述API記錄模塊根據(jù)OpenGL ES1.x標(biāo)準中的API原型依次記錄API的輸入?yún)?shù)。
5.如權(quán)利要求3所述的圖像顯示系統(tǒng),其特征在于,所述需要進行特殊處理的API包括頂點屬性數(shù)組AP1、繪制圖元AP1、glBufferData以及glBufferSubData ;所述特殊處理包括: 所述API記錄模塊調(diào)用未綁定頂點屬性緩沖區(qū)的頂點屬性數(shù)組API時將除了頂點屬性數(shù)據(jù)之外的參數(shù)記錄在glMsg中并添加到一個隊列中; 所述API記錄模塊調(diào)用glTexCoordPointer函數(shù)時在glMsg中增加一個參數(shù)記錄當(dāng)前綁定的紋理單元; 所述API記錄模塊執(zhí)行繪制圖元API中的gIDrawArrays和glDrawElements時,從隊列中依次取出緩存的頂點屬性數(shù)組API的glMsg,在原始的glMsg上將參與繪圖的頂點屬性數(shù)據(jù)記錄下來以構(gòu)成完整的glMsg,并在執(zhí)行g(shù)lDrawArrays或glDrawElements結(jié)束后清空隊列; 所述API記錄模塊執(zhí)行g(shù)lBufferData和glBufferSubData時在上下文中為每個索引緩沖區(qū)對象分配一塊相同大小的備份索引緩沖區(qū),以及在glBufferData/glBufferSubData更新數(shù)據(jù)到索引緩沖區(qū)的同時將數(shù)據(jù)更新到對應(yīng)的備份索引緩沖區(qū),使得備份索引緩沖區(qū)中的數(shù)據(jù)與索引緩沖區(qū)保持一致。
6.如權(quán)利要求1所述的圖像顯示系統(tǒng),其特征在于,所述打包模塊將一幀中的API數(shù)據(jù)包組合成一個幀數(shù)據(jù)包,還用于判斷當(dāng)前的幀`數(shù)據(jù)包的大小是否超過一個閾值,若確定當(dāng)前幀數(shù)據(jù)包的大小超過所述閾值時則無論這一幀是否結(jié)束都將當(dāng)前的幀數(shù)據(jù)包發(fā)送至所述壓縮模塊,并將所述幀剩余的API數(shù)據(jù)包再組成一個或多個新的幀數(shù)據(jù)包。
7.如權(quán)利要求1所述的圖像顯示方法,其特征在于,所述壓縮模塊以所述打包模塊輸出的一個數(shù)據(jù)包作為單位進行數(shù)據(jù)包壓縮,所述壓縮算法包括通用壓縮算法和差量壓縮算法,當(dāng)前API數(shù)據(jù)包和上一個API數(shù)據(jù)包相似程度較高時所述壓縮模塊使用差量壓縮算法對當(dāng)前API數(shù)據(jù)包進行壓縮,當(dāng)前API數(shù)據(jù)包和上一個API數(shù)據(jù)包的相關(guān)性較弱時所述壓縮模塊使用通用壓縮算法對當(dāng)前API數(shù)據(jù)包進行壓縮。
8.如權(quán)利要求7所述的圖像顯示方法,其特征在于,所述壓縮協(xié)議信息包括壓縮后數(shù)據(jù)包的校驗值、壓縮類型、壓縮前的數(shù)據(jù)量以及壓縮后的數(shù)據(jù)量。
9.一種圖像顯示方法,其特征在于,所述方法包括: 根據(jù)運行應(yīng)用程序時發(fā)出的第一 API重新定向到封裝層中對應(yīng)的第二 API,以及根據(jù)系統(tǒng)設(shè)置判斷是否記錄所述第一 API信息; 記錄所述第一 API信息; 將記錄的API信息生成相應(yīng)的API數(shù)據(jù)包; 將一個或多個所述API數(shù)據(jù)包組合成一個幀數(shù)據(jù)包; 利用一壓縮算法對所述幀數(shù)據(jù)包進行壓縮以形成相應(yīng)的壓縮包,并添加相應(yīng)的壓縮協(xié)議信息至所述壓縮包; 分析所述壓縮包的協(xié)議信息以得到一個或多個原始幀數(shù)據(jù)包; 獲取所述一個或多個原始的幀數(shù)據(jù)包,并依次根據(jù)每個數(shù)據(jù)包的壓縮協(xié)議信息獲得每幀中的API信息;以及執(zhí)行獲取的所述API信息以顯示相應(yīng)的圖像。
10.如權(quán)利要求9所述的圖像顯示方法,其特征在于,所述方法由運行于一主機裝置中的圖像顯示系統(tǒng)執(zhí)行。
11.如權(quán)利要求9所述的圖像顯示方法,其特征在于,所述方法由第一主機裝置和第二主機裝置共同運行的圖像顯示系統(tǒng)執(zhí)行。
12.如權(quán)利要求9所述的圖像顯示方法,其特征在于,所述API信息包括API名稱、上下文、輸入?yún)?shù)和返回值,所述“記錄所述第一 API信息”包括: 記錄所述第一 API信息中的函數(shù)名稱、上下文以及輸入?yún)?shù); 判斷所述第一 API信息中具有數(shù)據(jù)指針時復(fù)制指針?biāo)赶虻臄?shù)據(jù); 獲取并執(zhí)行所述第一 API以顯示相應(yīng)的圖像; 判斷執(zhí)行所述第一 API完成后產(chǎn)生返回值時記錄所述第一 API執(zhí)行完成后產(chǎn)生的返回值;以及 判斷所述第一 API信息需要進行特殊處理時對所述第一 API進行特殊處理。
13.如權(quán)利要求12所述的圖像顯示方法,其特征在于,所述應(yīng)用程序為OpenGLESl.x,所述“記錄所述第一 API信息中的函數(shù)名稱、上下文以及輸入?yún)?shù)”包括: 用連續(xù)的正整數(shù)表示記錄的API名稱,且每個API與一個數(shù)字對應(yīng); 用正整數(shù)標(biāo)識上下文,且每個上·下文與一個數(shù)字對應(yīng); 以及根據(jù)所述OpenGL ES1.x標(biāo)準中的API原型依次記錄API的輸入?yún)?shù)。
14.如權(quán)利要求12所述的圖像顯示方法,其特征在于,所述需要進行特殊處理的API包括頂點屬性數(shù)組AP1、繪制圖元AP1、glBufferData以及glBufferSubData,所述“判斷所述第一 API信息需要進行特殊處理時對所述第一 API進行特殊處理”包括: 調(diào)用未綁定頂點屬性緩沖區(qū)的頂點屬性數(shù)組API時將除了頂點屬性數(shù)據(jù)之外的參數(shù)記錄在glMsg中并添加到一個隊列中; 調(diào)用glTexCoordPointer函數(shù)時在glMsg中增加一個參數(shù)記錄當(dāng)前綁定的紋理單元;執(zhí)行繪制圖元API中的glDrawArrays和glDrawElements時,從隊列中依次取出緩存的頂點屬性數(shù)組API的glMsg,在原始的glMsg上將參與繪圖的頂點屬性數(shù)據(jù)記錄下來以構(gòu)成完整的glMsg,并在執(zhí)行g(shù)lDrawArrays或glDrawElements結(jié)束后清空隊列; 執(zhí)行g(shù)lBufferData和glBufferSubData時在上下文中為每個索引緩沖區(qū)對象分配一塊相同大小的備份索引緩沖區(qū),以及在glBufferData/glBufferSubData更新數(shù)據(jù)到索引緩沖區(qū)的同時將數(shù)據(jù)更新到對應(yīng)的備份索引緩沖區(qū),使得備份索引緩沖區(qū)中的數(shù)據(jù)與索引緩沖區(qū)保持一致。
15.如權(quán)利要求9所述的圖像顯示方法,其特征在于,所述“將一個或多個所述API數(shù)據(jù)包組合成一個幀數(shù)據(jù)包”包括: 將一幀中的所有API數(shù)據(jù)包組合成一個幀數(shù)據(jù)包; 以及判斷當(dāng)前的幀數(shù)據(jù)包的大小是否超過一個閾值,若確定當(dāng)前幀數(shù)據(jù)包的大小超過所述閾值時則無論這一幀是否結(jié)束,都將當(dāng)前的幀數(shù)據(jù)包發(fā)送,并將所述幀剩余的API數(shù)據(jù)包再組成一個或多個新的幀數(shù)據(jù)包。
16.如權(quán)利要求9所述的圖像顯示方法,其特征在于,所述壓縮算法包括通用壓縮算法和差量壓縮算法,當(dāng)前API數(shù)據(jù)包和上一個API數(shù)據(jù)包相似程度較高時使用差量壓縮算法對當(dāng)前API數(shù)據(jù)包進行壓縮,當(dāng)前API數(shù)據(jù)包和上一個API數(shù)據(jù)包的相關(guān)性較弱時使用通用壓縮算法對當(dāng)前API數(shù)據(jù)包進行壓縮。
17.如權(quán)利要求16所述的圖像顯示方法,其特征在于,所述壓縮協(xié)議信息包括壓縮后數(shù)據(jù)包的校驗值、壓 縮類型、壓縮前的數(shù)據(jù)量以及壓縮后的數(shù)據(jù)量。
【文檔編號】G06F3/14GK103593184SQ201310533116
【公開日】2014年2月19日 申請日期:2013年10月31日 優(yōu)先權(quán)日:2013年10月31日
【發(fā)明者】陳屴, 曾飛 申請人:福州瑞芯微電子有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
宁安市| 松潘县| 青海省| 碌曲县| 西藏| 麦盖提县| 文登市| 都安| 朔州市| 长泰县| 长寿区| 宜宾县| 长顺县| 新丰县| 卓资县| 德昌县| 新沂市| 霍城县| 安义县| 武夷山市| 普安县| 泊头市| 泰安市| 邵阳市| 赤壁市| 和政县| 营口市| 汾西县| 鄢陵县| 什邡市| 昭觉县| 泸溪县| 奉新县| 衡水市| 班戈县| 阿城市| 阿拉善盟| 滨海县| 庆城县| 浦北县| 上犹县|