本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,具體而言,涉及一種跨引擎調(diào)用方法及裝置。
背景技術(shù):
::目前,相關(guān)技術(shù)中提供的Unity(其為一種游戲引擎的名稱)引擎由于使用的是編譯型編程語言C#,因此,在開發(fā)過程中,無法及時(shí)在實(shí)體設(shè)備上查詢最新的程序運(yùn)行效果,而需要經(jīng)歷漫長的編譯安裝等待,由此造成開發(fā)效率較低。此外,在提交移動終端應(yīng)用程序(App)發(fā)布渠道后,無法修改游戲邏輯。如果存在漏洞(bug)需要修復(fù),則必須重新提交App審核,由此造成修復(fù)周期較長。對于上述問題,如果能夠在Unity引擎中嵌入腳本編程語言Lua腳本系統(tǒng),則可以跳過編譯,快速更新安裝在實(shí)體設(shè)備上的程序,同時(shí)還可以繞過App發(fā)布渠道即時(shí)進(jìn)行bug修復(fù)。由于Unity引擎中沒有提供編譯型編程語言C應(yīng)用程序編程接口(API),而只存在C#API。為此,相關(guān)技術(shù)中所提出的技術(shù)方案都是采用LuaCAPI將C#類導(dǎo)出至Lua中。Lua調(diào)用C#的方式是采用Lua代理對象來操作對應(yīng)的C#對象。而C#調(diào)用Lua的方式則是直接通過LuaCAPI調(diào)用Lua函數(shù)。然而,相關(guān)技術(shù)中所提出的上述解決方案存在如下技術(shù)缺陷:(1)Lua綁定C#類的開銷較大,其原因在于:一方面是由于每個(gè)Lua與C#跨語言調(diào)用都會產(chǎn)生多個(gè)LuaCAPI調(diào)用,從而使得跨語言調(diào)用的速度較慢;另一方面是由于Lua與C#跨語言互相引用對象會產(chǎn)生額外的對象管理開銷,例如:對象存入引用字典、對象查詢、對象類型轉(zhuǎn)換、對象銷毀。(2)因執(zhí)行效率較低易導(dǎo)致相關(guān)技術(shù)中大多數(shù)使用Lua腳本系統(tǒng)的Unity游戲腳本化程度較低。采用Lua控制的部分主要集中于菜單界面、網(wǎng)絡(luò)通信部分,而戰(zhàn)斗部分、資源加載部分則很少使用Lua腳本控制,由此造成實(shí)體設(shè)備上高速開發(fā)的部分較為局限,并且繞過App發(fā)布而使用腳本修正的bug范圍也十分有限。針對上述的問題,目前尚未提出有效的解決方案。技術(shù)實(shí)現(xiàn)要素:本發(fā)明實(shí)施例提供了一種跨引擎調(diào)用方法及裝置,以至少解決相關(guān)技術(shù)中提供的在Unity引擎中嵌入Lua腳本系統(tǒng)的技術(shù)方案的跨語言調(diào)用速度較慢,執(zhí)行效率較低的技術(shù)問題。根據(jù)本發(fā)明實(shí)施例的一個(gè)方面,提供了一種跨引擎調(diào)用方法,包括:第一引擎獲取第一數(shù)據(jù)集合,其中,第一引擎采用編譯型編程語言,第一數(shù)據(jù)集合包括一種或多種類型回調(diào)事件的序列化結(jié)果;第一引擎向第二引擎?zhèn)魅氲谝粩?shù)據(jù)集合,其中,第二引擎采用腳本編程語言;第一引擎接收來自于第二引擎的第二數(shù)據(jù)集合,其中,第二數(shù)據(jù)集合包括:對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶畹男蛄谢Y(jié)果??蛇x地,第一引擎獲取第一數(shù)據(jù)集合包括:第一引擎獲取待操作的一個(gè)或多個(gè)游戲?qū)ο?;第一引擎分別收集與每種游戲?qū)ο髮?yīng)的回調(diào)事件,并分別對收集到的回調(diào)事件進(jìn)行序列化處理,得到待拼接的序列化結(jié)果;第一引擎將得到的與每種游戲?qū)ο髮?yīng)的待拼接的序列化結(jié)果進(jìn)行拼接,獲取第一數(shù)據(jù)集合,其中,第一數(shù)據(jù)集合記錄每個(gè)回調(diào)事件所歸屬的游戲?qū)ο???蛇x地,第一引擎獲取第一數(shù)據(jù)集合還包括:第一引擎獲取當(dāng)前存在的全部幀事件,其中,幀事件包括以下至少之一:渲染幀更新事件、邏輯幀更新事件;第一引擎將獲取到的幀事件拼接至第一數(shù)據(jù)集合??蛇x地,第一引擎向第二引擎?zhèn)魅氲谝粩?shù)據(jù)集合包括:第一引擎對一種或多種類型回調(diào)事件執(zhí)行序列化操作,得到二進(jìn)制數(shù)據(jù)塊;第一引擎將二進(jìn)制數(shù)據(jù)塊的內(nèi)存指針和長度傳入第二引擎??蛇x地,在第一引擎接收來自于第二引擎的第二數(shù)據(jù)集合之后,還包括:第一引擎從第二數(shù)據(jù)集合中獲取對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶?;第一引擎分別確定每條操作指令對應(yīng)的游戲?qū)ο?,并將每條操作指令分發(fā)至對應(yīng)的游戲?qū)ο?。可選地,一種或多種類型回調(diào)事件包括以下至少之一:幀事件、游戲?qū)ο笊芷谑录⑽锢硎录?、界面操作事件。根?jù)本發(fā)明實(shí)施例的另一方面,還提供了另一種跨引擎調(diào)用方法,包括:第二引擎接收來自于第一引擎的第一數(shù)據(jù)集合,其中,第一引擎采用編譯型編程語言,第二引擎采用腳本編程語言,第一數(shù)據(jù)集合包括一種或多種類型回調(diào)事件的序列化結(jié)果;第二引擎獲取與第一數(shù)據(jù)集合對應(yīng)的第二數(shù)據(jù)集合,其中,第二數(shù)據(jù)集合包括:對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶畹男蛄谢Y(jié)果;第二引擎將第二數(shù)據(jù)集合返回至第一引擎。可選地,第二引擎接收來自于第一引擎的第一數(shù)據(jù)集合包括:第二引擎獲取在第一引擎對一種或多種類型回調(diào)事件進(jìn)行序列化處理后得到的二進(jìn)制數(shù)據(jù)塊的內(nèi)存指針和長度;第二引擎根據(jù)內(nèi)存指針和長度接收第一數(shù)據(jù)集合。可選地,第二引擎獲取第二數(shù)據(jù)集合包括:第二引擎從預(yù)設(shè)對應(yīng)關(guān)系中確定一種或多種類型回調(diào)事件中每個(gè)回調(diào)事件對應(yīng)的處理組件,其中,預(yù)設(shè)對應(yīng)關(guān)系中存儲有與每個(gè)回調(diào)事件歸屬的游戲?qū)ο髽?biāo)識與處理組件的對應(yīng)關(guān)系;第二引擎將每個(gè)回調(diào)事件分發(fā)至確定的處理組件;第二引擎獲取全部確定的處理組件反饋的操作指令,得到第二數(shù)據(jù)集合。可選地,第二引擎獲取全部確定的處理組件反饋的操作指令,得到第二數(shù)據(jù)集合包括:第二引擎將獲取到的每條操作指令序列化成指令標(biāo)識和指令參數(shù)的組合方式,其中,指令標(biāo)識用于指示待調(diào)用的函數(shù),指令參數(shù)用于指示在待調(diào)用的函數(shù)中待操作的參數(shù);第二引擎按照序列化后操作指令的數(shù)據(jù)類型執(zhí)行內(nèi)存對齊操作,得到第二數(shù)據(jù)集合??蛇x地,第二引擎將第二數(shù)據(jù)集合返回至第一引擎包括:第二引擎獲取通過對所述一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶钸M(jìn)行序列化處理得到的序列化結(jié)果的內(nèi)存地址和長度數(shù)據(jù);第二引擎將內(nèi)存地址和長度數(shù)據(jù)返回至第一引擎。根據(jù)本發(fā)明實(shí)施例的又一方面,提供了一種跨引擎調(diào)用裝置,包括:第一獲取模塊,用于獲取第一數(shù)據(jù)集合,其中,第一引擎采用編譯型編程語言,第一數(shù)據(jù)集合包括一種或多種類型回調(diào)事件的序列化結(jié)果;處理模塊,用于向第二引擎?zhèn)魅氲谝粩?shù)據(jù)集合,其中,第二引擎采用腳本編程語言;接收模塊,用于接收來自于第二引擎的第二數(shù)據(jù)集合,其中,第二數(shù)據(jù)集合包括:對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶畹男蛄谢Y(jié)果。可選地,第一獲取模塊包括:第一獲取單元,用于獲取待操作的一個(gè)或多個(gè)的游戲?qū)ο?;收集單元,用于分別收集與每種游戲?qū)ο髮?yīng)的回調(diào)事件,并分別對收集到的回調(diào)事件進(jìn)行序列化處理,得到待拼接的序列化結(jié)果;第二獲取單元,用于將得到的與每種游戲?qū)ο髮?yīng)的待拼接的序列化結(jié)果進(jìn)行拼接,獲取第一數(shù)據(jù)集合,其中,第一數(shù)據(jù)集合記錄每個(gè)回調(diào)事件所歸屬的游戲?qū)ο?。可選地,第一獲取模塊還包括:第三獲取單元,用于獲取當(dāng)前存在的全部幀事件,其中,幀事件包括以下至少之一:渲染幀更新事件、邏輯幀更新事件;第四獲取單元,用于將獲取到的幀事件拼接至第一數(shù)據(jù)集合??蛇x地,處理模塊包括:第一處理單元,用于對一種或多種類型回調(diào)事件執(zhí)行序列化操作,得到二進(jìn)制數(shù)據(jù)塊;第二處理單元,用于將二進(jìn)制數(shù)據(jù)塊的內(nèi)存指針和長度傳入第二引擎??蛇x地,上述裝置還包括:第二獲取模塊,用于從第二數(shù)據(jù)集合中獲取對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶?;分發(fā)模塊,用于分別確定每條操作指令對應(yīng)的游戲?qū)ο?,并將每條操作指令分發(fā)至對應(yīng)的游戲?qū)ο?。可選地,一種或多種類型回調(diào)事件包括以下至少之一:幀事件、游戲?qū)ο笊芷谑录?、物理事件、界面操作事件。根?jù)本發(fā)明實(shí)施例的再一方面,還提供了另一種跨引擎調(diào)用裝置,包括:處理模塊,用于接收來自于第一引擎的第一數(shù)據(jù)集合,其中,第一引擎采用編譯型編程語言,第二引擎采用腳本編程語言,第一數(shù)據(jù)集合包括一種或多種類型回調(diào)事件的序列化結(jié)果;獲取模塊,用于獲取與第一數(shù)據(jù)集合對應(yīng)的第二數(shù)據(jù)集合,其中,第二數(shù)據(jù)集合包括:對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶畹男蛄谢Y(jié)果;反饋模塊,用于將第二數(shù)據(jù)集合返回至第一引擎。可選地,處理模塊包括:第一獲取單元,用于獲取在第一引擎對一種或多種類型回調(diào)事件進(jìn)行序列化處理后得到的二進(jìn)制數(shù)據(jù)塊的內(nèi)存指針和長度;接收單元,用于根據(jù)內(nèi)存指針和長度接收第一數(shù)據(jù)集合。可選地,獲取模塊包括:第一確定單元,用于從預(yù)設(shè)對應(yīng)關(guān)系中確定一種或多種類型回調(diào)事件中每個(gè)回調(diào)事件對應(yīng)的處理組件,其中,預(yù)設(shè)對應(yīng)關(guān)系中存儲有與每個(gè)回調(diào)事件歸屬的游戲?qū)ο髽?biāo)識與處理組件的對應(yīng)關(guān)系;分發(fā)單元,用于將每個(gè)回調(diào)事件分發(fā)至確定的處理組件;第二獲取單元,用于獲取全部確定的處理組件反饋的操作指令,得到第二數(shù)據(jù)集合??蛇x地,第二獲取單元包括:處理子單元,用于將獲取到的每條操作指令序列化成指令標(biāo)識和指令參數(shù)的組合方式,其中,指令標(biāo)識用于指示待調(diào)用的函數(shù),指令參數(shù)用于指示在待調(diào)用的函數(shù)中待操作的參數(shù);獲取子單元,用于按照序列化后操作指令的數(shù)據(jù)類型執(zhí)行內(nèi)存對齊操作,得到第二數(shù)據(jù)集合。可選地,反饋模塊包括:第二確定單元,用于獲取通過對所述一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶钸M(jìn)行序列化處理得到的序列化結(jié)果的內(nèi)存地址和長度數(shù)據(jù);反饋單元,用于將內(nèi)存地址和長度數(shù)據(jù)返回至第一引擎。在本發(fā)明實(shí)施例中,采用編譯型編程語言的第一引擎獲取包括一種或多種類型回調(diào)事件的序列化結(jié)果的第一數(shù)據(jù)集合,通過第一引擎向采用腳本編程語言的第二引擎?zhèn)魅氲谝粩?shù)據(jù)集合,然后再接收來自于第二引擎的包括對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶畹男蛄谢Y(jié)果的第二數(shù)據(jù)集合,從而實(shí)現(xiàn)了減少跨語言調(diào)用次數(shù),達(dá)到了增加跨語言調(diào)用的速度的目的,縮短消耗在跨語言調(diào)用上的時(shí)間以及提高跨語言調(diào)用的執(zhí)行效率的技術(shù)效果,進(jìn)而解決了相關(guān)技術(shù)中提供的在Unity引擎中嵌入Lua腳本系統(tǒng)的技術(shù)方案的跨語言調(diào)用速度較慢,執(zhí)行效率較低的技術(shù)問題。附圖說明此處所說明的附圖用來提供對本發(fā)明的進(jìn)一步理解,構(gòu)成本申請的一部分,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中:圖1是根據(jù)本發(fā)明實(shí)施例的跨引擎調(diào)用方法的流程圖;圖2是根據(jù)本發(fā)明優(yōu)選實(shí)施例的批量調(diào)用實(shí)現(xiàn)過程的示意圖;圖3是根據(jù)本發(fā)明實(shí)施例的另一種跨引擎調(diào)用方法的流程圖;圖4是根據(jù)本發(fā)明優(yōu)選實(shí)施例的混雜指令內(nèi)存對齊方式的示意圖;圖5是根據(jù)本發(fā)明實(shí)施例的一種跨引擎調(diào)用裝置的流程圖;圖6是根據(jù)本發(fā)明優(yōu)選實(shí)施例的一種跨引擎調(diào)用裝置的流程圖;圖7是根據(jù)本發(fā)明實(shí)施例的另一種跨引擎調(diào)用裝置的流程圖。具體實(shí)施方式為了使本
技術(shù)領(lǐng)域:
:的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分的實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本發(fā)明保護(hù)的范圍。需要說明的是,本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的本發(fā)明的實(shí)施例能夠以除了在這里圖示或描述的那些以外的順序?qū)嵤?。此外,術(shù)語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。根據(jù)本發(fā)明實(shí)施例,提供了一種跨引擎調(diào)用方法的實(shí)施例,需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。圖1是根據(jù)本發(fā)明實(shí)施例的跨引擎調(diào)用方法的流程圖,如圖1所示,該方法包括如下步驟:步驟S12,第一引擎獲取第一數(shù)據(jù)集合,其中,第一引擎采用編譯型編程語言,第一數(shù)據(jù)集合包括一種或多種類型回調(diào)事件的序列化結(jié)果;步驟S14,第一引擎向第二引擎?zhèn)魅氲谝粩?shù)據(jù)集合,其中,第二引擎采用腳本編程語言;步驟S16,第一引擎接收來自于第二引擎的第二數(shù)據(jù)集合,其中,第二數(shù)據(jù)集合包括:對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶畹男蛄谢Y(jié)果。通過上述步驟,采用編譯型編程語言的第一引擎獲取包括一種或多種類型回調(diào)事件的序列化結(jié)果的第一數(shù)據(jù)集合,通過第一引擎向第二引擎?zhèn)魅氲谝粩?shù)據(jù)集合,然后再接收來自于第二引擎的包括對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶畹男蛄谢Y(jié)果的第二數(shù)據(jù)集合,達(dá)到了Unity游戲引擎(相當(dāng)于上述第一引擎)只需要一次調(diào)用Lua游戲引擎(相當(dāng)于上述第二引擎),便可以批量地完成多個(gè)Unity游戲引擎(下文中稱為C#端)到Lua游戲引擎(下文中稱為Lua端)的事件回調(diào)以及多個(gè)Lua端對C#端API的調(diào)用,以增加跨語言調(diào)用的速度的目的,從而實(shí)現(xiàn)了減少跨語言調(diào)用次數(shù),縮短消耗在跨語言調(diào)用上的時(shí)間以及提高跨語言調(diào)用的執(zhí)行效率的技術(shù)效果,進(jìn)而解決了相關(guān)技術(shù)中提供的在Unity引擎中嵌入Lua腳本系統(tǒng)的技術(shù)方案的跨語言調(diào)用速度較慢,執(zhí)行效率較低的技術(shù)問題。在優(yōu)選實(shí)施過程中,上述一種或多種類型回調(diào)事件可以包括但不限于以下至少之一:(1)幀事件;(2)游戲?qū)ο笊芷谑录?3)物理事件;(4)界面操作事件。游戲?qū)ο?GameObject)是Unity游戲引擎的一種基礎(chǔ)物體,其上可以掛接多種組件(Component),GameObject下可以存在很多子GameObject,以構(gòu)成樹狀結(jié)構(gòu),GameObject具有enable和disable狀態(tài);Component必須掛接在GameObject上,不能單獨(dú)存在,當(dāng)其所掛接的GameObject被銷毀時(shí),Component也會隨之一同被銷毀,Component可以實(shí)現(xiàn)3D模型顯示、動畫、粒子等多種功能。MonoBehaviour是Unity提供的一個(gè)C#基類,通過繼承它,可以創(chuàng)建自定義類型的Component,其可以監(jiān)聽多種回調(diào)事件,這些回調(diào)事件可以包括但不限于:幀事件(例如:Unity的渲染幀更新事件、Unity的邏輯幀更新事件),生命周期事件(例如:OnEnable事件、OnDisable事件、OnDestroy事件),物理事件(例如:OnCollisionEnter2D事件、OnCollisionExit2D事件),界面相關(guān)的操作事件。這些事件的來源是當(dāng)前MonoBehaviour所掛接的GameObject,以及其上掛接的其它Component。分批處理的游戲?qū)ο?BatchedGameObject)組件是優(yōu)選實(shí)施例實(shí)現(xiàn)的一個(gè)Component,用于通過它控制它所掛接的GameObject,以及收集此GameObject的各種回調(diào)事件。在通常情況下,常見的必選的回調(diào)事件可以包括:Unity中的GameObject生命周期相關(guān)的回調(diào),即OnEnable,OnDisable,OnDestroy。另外,常見的可選回調(diào)事件可以包括但不限于:物理相關(guān)的碰撞檢測事件,界面相關(guān)的操作事件。可選地,在步驟S12中,第一引擎獲取第一數(shù)據(jù)集合可以包括以下執(zhí)行步驟:步驟S121,第一引擎獲取待操作的一個(gè)或多個(gè)游戲?qū)ο?例如:BatchedGameObject)組件;步驟S122,第一引擎分別收集與每種BatchedGameObject組件對應(yīng)的回調(diào)事件,并分別對收集到的回調(diào)事件進(jìn)行序列化處理,得到待拼接的序列化結(jié)果;步驟S123,第一引擎將得到的與每種BatchedGameObject組件對應(yīng)的待拼接的序列化結(jié)果進(jìn)行拼接,獲取第一數(shù)據(jù)集合,其中,第一數(shù)據(jù)集合記錄每個(gè)回調(diào)事件所歸屬的BatchedGameObject組件。圖2是根據(jù)本發(fā)明優(yōu)選實(shí)施例的批量調(diào)用實(shí)現(xiàn)過程的示意圖。如圖2所示,BatchedGameObject和LuaBehaviour的創(chuàng)建和銷毀過程如下:BatchedGameObject是由Lua代碼通過現(xiàn)有的Lua調(diào)用C#的過程,從Prefab創(chuàng)建的。因?yàn)樵搫?chuàng)建操作不會過于頻繁,所以可以直接采用現(xiàn)有的跨語言調(diào)用方式即可。在BatchedGameObject創(chuàng)建完成后,會生成一個(gè)對應(yīng)的BatchedGameObjectID來標(biāo)識該BatchedGameObject,C#中的批量調(diào)用管理器會將其加入至BatchedGameObject字典。此外,Lua中也會創(chuàng)建一個(gè)LuaBehaviour與該BatchedGameObject進(jìn)行綁定,其綁定方式便是將BatchedGameObjectID添加至Lua的LuaBehaviour表中。當(dāng)BatchedGameObject被銷毀時(shí),其對應(yīng)的OnDestroy事件將會通過批量回調(diào)隊(duì)列傳入至Lua,Lua批量調(diào)用管理器就會將LuaBehaviour表中對應(yīng)的LuaBehavour加以清除。綜上所述,批量調(diào)用的跨語言內(nèi)存管理規(guī)則可以簡化為:完全是基于C#中的BatchedGameObject字典和Lua中的LuaBehaviour表,并且LuaBehaviour的創(chuàng)建與銷毀完全依賴于BatchedGameObject的創(chuàng)建與銷毀。C#端的批量調(diào)用管理器將回調(diào)事件緩存至批量回調(diào)隊(duì)列(相當(dāng)于上述第一數(shù)據(jù)集合)中。C#端的批量調(diào)用管理器是可以通過MonoBehaviour實(shí)現(xiàn)的一個(gè)Component。在整個(gè)游戲過程中需要確保其永遠(yuǎn)不被銷毀。由游戲邏輯監(jiān)聽到的全部Unity引擎事件都需要由C#端的批量調(diào)用管理器來收集,游戲邏輯所發(fā)出的所有引擎操作指令也都需要由C#端的批量調(diào)用管理器來分發(fā)。在優(yōu)選實(shí)施例中,批量回調(diào)隊(duì)列的結(jié)構(gòu)如下:每種回調(diào)類型分別對應(yīng)一個(gè)特定的批量回調(diào)隊(duì)列。由此回調(diào)過程通常是不需要考慮先后順序的,按照類型存放收集到的回調(diào)事件可以對相同數(shù)據(jù)結(jié)構(gòu)進(jìn)行集中存儲和處理,從而提高程序運(yùn)行效率。對于C#端的批量調(diào)用管理器而言,可以將具有相同數(shù)據(jù)結(jié)構(gòu)的回調(diào)事件設(shè)置在一起進(jìn)行批量序列化處理。而對于Lua端的批量調(diào)用管理器而言,相同類型的回調(diào)事件會在一起集中批量處理。例如:BatchedGameObject組件可以收集OnEnable事件并存入對應(yīng)的OnEnable事件隊(duì)列中,還可以收集OnDisable事件存入對應(yīng)的OnDisable事件隊(duì)列中。在對回調(diào)事件隊(duì)列進(jìn)行序列化處理時(shí),每個(gè)不同類型的批量回調(diào)隊(duì)列會分別序列化,然后拼接在一起組成一個(gè)完整的批量回調(diào)事件隊(duì)列序列化結(jié)果。進(jìn)一步地,存儲的回調(diào)事件信息需要包含的一項(xiàng)重要內(nèi)容便是:BatchedGameObjectID,用于表明每個(gè)存儲的回調(diào)事件是由哪個(gè)BatchedGameObject對象發(fā)出的。這樣,Lua端的批量調(diào)用管理器才能夠?qū)⑵浞职l(fā)到對應(yīng)的LuaBehavour。當(dāng)然,不同的回調(diào)事件也可能會包含其他信息,例如:物理碰撞事件的信息還可以包含:進(jìn)入碰撞的另一個(gè)是什么物體。可選地,在步驟S12中,第一引擎獲取第一數(shù)據(jù)集合還可以包括以下執(zhí)行步驟:步驟S124,第一引擎獲取當(dāng)前存在的全部幀事件,其中,幀事件包括以下至少之一:渲染幀更新事件、邏輯幀更新事件;步驟S125,第一引擎將獲取到的幀事件拼接至第一數(shù)據(jù)集合。Unity中的渲染幀更新事件和邏輯幀更新事件分別被稱為Update事件和FixedUpdate事件。由于Update與FixedUpdate這兩個(gè)回調(diào)事件的產(chǎn)生頻率非常高,Unity會在每個(gè)渲染幀觸發(fā)全部Update事件,以及會在每個(gè)邏輯幀觸發(fā)全部FixedUpdate事件,因此,批量調(diào)用管理器無需收集每個(gè)BatchedGameObject的Update與FixedUpdate回調(diào)事件。而是僅僅在C#端的批量調(diào)用管理器的Update或FixedUpdate事件時(shí)將一個(gè)總Update事件或總FixedUpdate事件放入批量回調(diào)隊(duì)列??俇pdate事件或總FixedUpdate事件僅意味著當(dāng)前所有的Update事件或FixedUpdate事件需要被觸發(fā),這個(gè)事件數(shù)據(jù)里面并沒有記錄具體要觸發(fā)哪些LuaBehaviour的Update或FixedUpdate事件。Lua端的批量調(diào)用管理器一旦接收到總Update事件或總FixedUpdate事件,就會向各個(gè)LuaBehaviour發(fā)送Update事件或FixedUpdate事件??蛇x地,在步驟S14中,第一引擎向第二引擎?zhèn)魅氲谝粩?shù)據(jù)集合可以包括以下執(zhí)行步驟:步驟S141,第一引擎運(yùn)行啟動腳本,獲取第二引擎入口函數(shù);步驟S142,第一引擎調(diào)用第二引擎入口函數(shù),向第二引擎?zhèn)魅氲谝粩?shù)據(jù)集合。如圖2所示,在Unity的游戲循環(huán)的Update和FixedUpdate時(shí)機(jī),C#端的批量調(diào)用管理器將會調(diào)用Lua端的批量調(diào)用管理器入口函數(shù),并將批量回調(diào)隊(duì)列的內(nèi)容傳入Lua端的批量調(diào)用管理器。Unity會在每個(gè)渲染幀觸發(fā)全部Update事件,以及會在每個(gè)邏輯幀觸發(fā)全部FixedUpdate事件。C#端的批量調(diào)用管理器本身是基于MonoBehaviour實(shí)現(xiàn)的一個(gè)Component,其可以接收到Update和FixedUpdate事件。當(dāng)C#端的批量調(diào)用管理器接收到Update事件時(shí),便說明當(dāng)前正處于Unity游戲循環(huán)的Update時(shí)機(jī),這時(shí)將會調(diào)用Lua端的批量調(diào)用管理器入口函數(shù),并將批量回調(diào)隊(duì)列的內(nèi)容傳入Lua端的批量調(diào)用管理器。當(dāng)C#端的批量調(diào)用管理器接收到FixedUpdate事件時(shí),便說明當(dāng)前正處于Unity游戲循環(huán)的FixedUpdate時(shí)機(jī),這時(shí)將會調(diào)用Lua端的批量調(diào)用管理器入口函數(shù),并將批量回調(diào)隊(duì)列的內(nèi)容傳入Lua端的批量調(diào)用管理器。C#端的批量調(diào)用管理器首次獲取Lua端的批量調(diào)用管理器的入口函數(shù)的方式在于:C#端的批量調(diào)用管理器在啟動時(shí)執(zhí)行的第一個(gè)Lua腳本函數(shù)的返回值,即為Lua端的批量調(diào)用管理器的入口函數(shù)。隨后,C#端的批量調(diào)用管理器會將這個(gè)函數(shù)存儲至Lua端的Register中。以后,每次需要調(diào)用Lua端的批量調(diào)用管理器的入口函數(shù)時(shí),都可以通過Lua端的Register來獲取。批量回調(diào)隊(duì)列原本屬于C#的數(shù)據(jù)結(jié)構(gòu),其傳入Lua端的方式在于:先將批量回調(diào)隊(duì)列序列化成二進(jìn)制數(shù)據(jù)塊,然后將這個(gè)數(shù)據(jù)塊的內(nèi)存指針和長度作為函數(shù)參數(shù)傳入Lua端的入口函數(shù)??蛇x地,在步驟S142中,第一引擎向第二引擎?zhèn)魅氲谝粩?shù)據(jù)集合可以包括以下執(zhí)行步驟:步驟S1421,第一引擎對一種或多種類型回調(diào)事件執(zhí)行序列化操作,得到二進(jìn)制數(shù)據(jù)塊;步驟S1422,第一引擎將二進(jìn)制數(shù)據(jù)塊的內(nèi)存指針和長度傳入第二引擎入口函數(shù)。上述序列化處理過程會將C#的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為一個(gè)C#byte數(shù)組。使用C#的GCHandle可以將這個(gè)C#byte數(shù)組鎖定并獲取內(nèi)存指針。該內(nèi)存指針可以轉(zhuǎn)換為Lualightuserdata,從而可以作為Lua端的批量調(diào)用管理器的入口函數(shù)的參數(shù)傳入??蛇x地,在步驟S16,第一引擎接收來自于第二引擎的第二數(shù)據(jù)集合之后,還可以包括以下執(zhí)行步驟:步驟S17,第一引擎從第二數(shù)據(jù)集合中獲取對BatchedGameObject組件的操作指令;步驟S18,第一引擎分別確定每條操作指令對應(yīng)的BatchedGameObject組件,并將每條操作指令分發(fā)至對應(yīng)的BatchedGameObject組件。如圖2所示,C#端的批量調(diào)用管理器從批量調(diào)用隊(duì)列(相當(dāng)于上述第二數(shù)據(jù)集合)中讀取操作指令、分發(fā)并執(zhí)行各個(gè)操作指令,其中,批量調(diào)用隊(duì)列與批量回調(diào)隊(duì)列的區(qū)別在于:兩者的數(shù)據(jù)傳輸方向和傳輸內(nèi)容是不同的。批量調(diào)用管理器內(nèi)預(yù)先設(shè)置有一個(gè)BatchedGameObject的字典,可以根據(jù)BatchedGameObjectID查找對應(yīng)的BatchedGameObject。于是,可以根據(jù)操作指令中的BatchedGameObjectID信息將特定操作指令分發(fā)至對應(yīng)的BatchedGameObject。在優(yōu)選實(shí)施過程中,上述操作指令可以包括但不限于以下至少之一:1)GameObject相關(guān)指令(1)設(shè)置active狀態(tài);2)Transform相關(guān)指令(1)設(shè)置位置;(2)設(shè)置縮放;(3)設(shè)置歐拉角;(4)設(shè)置四元數(shù);3)剛體相關(guān)指令(1)設(shè)置位置;(2)設(shè)置移動目標(biāo);4)ICommonController控制指令為了使得腳本能夠進(jìn)行豐富地效果控制,本發(fā)明優(yōu)選實(shí)施例提供了一種ICommonController指令。LuaBehaviour可以通過發(fā)送指令來控制對應(yīng)的BatchedGameObject的,其既可以實(shí)現(xiàn)一些簡單的控制效果,例如:設(shè)置Enable狀態(tài)、設(shè)置空間變換、移動Rigidbody,實(shí)現(xiàn)這類控制效果的指令格式和內(nèi)容是相對固定的,所產(chǎn)生的控制效果也隨之固定;又可以實(shí)現(xiàn)一些復(fù)雜的控制效果,例如:動畫、粒子、聲音的控制。一個(gè)BatchedGameObject可能需要控制多種動畫、粒子、聲音的播放、而且播放的設(shè)置參數(shù)也有很多,故而這些效果適用于用ICommonController指令來進(jìn)行控制。這種指令在代碼層面沒有設(shè)定具體的控制規(guī)則,而是會由BatchedGameObject分發(fā)給一系列ICommonController組件,以產(chǎn)生相應(yīng)的控制效果。BatchedGameObject分發(fā)ICommonController指令的范圍是BatchedGameObject所在的GameObject及其所有子GameObject上掛接的ICommonController組件。ICommonController組件是指實(shí)現(xiàn)了ICommonController接口的組件。根據(jù)ICommonController組件的類型不同,可以控制動畫、粒子、聲音等效果。這些組件可以通過編輯器來設(shè)定具體的控制效果。故而,相同的ICommonController指令根據(jù)ICommonController組件的不同設(shè)置,可能會產(chǎn)生不同的效果。游戲角色表現(xiàn)可以包括但不限于:動畫效果、粒子效果、聲音效果,需要控制的引擎功能非常多。為了簡化API以及增加編輯器靈活性,可以將角色相關(guān)的控制統(tǒng)一編成ICommonController接口。至此,ICommonController指令即為調(diào)用ICommonController接口的指令。ICommonController接口均需要實(shí)現(xiàn)方法CommonControl,該方法的第一個(gè)參數(shù)是一個(gè)32bit整數(shù),用于表示效果名稱,該參數(shù)是由表示這個(gè)效果名字的字符串哈希計(jì)算得到的,后面幾個(gè)參數(shù)則是幾個(gè)任意32bit浮點(diǎn)數(shù),用于表示效果參數(shù)。不同的效果需要的參數(shù)數(shù)量以及參數(shù)的含義各不相同。下面將通過以下幾個(gè)具體示例對ICommonController接口的使用方式加以說明。示例一、Animator是一種Component,由Unity內(nèi)置提供,其可以控制動畫的播放,實(shí)現(xiàn)多段動畫素材的復(fù)雜融合,可以提供給程序控制動畫的接口是一組動畫事件參數(shù)。外部程序需要通過指定動畫事件參數(shù)的名字和值,來修改特定動畫事件參數(shù)的值。不同的動畫事件參數(shù)值的組合,可能會產(chǎn)生不同的動畫控制效果。因此,可以制作一個(gè)實(shí)現(xiàn)ICommonController接口的動畫控制器組件AnimatorController。CommonControl的效果名稱即對應(yīng)Animator的參數(shù)名,效果參數(shù)對應(yīng)Animator的參數(shù)值。示例二、粒子表示三維計(jì)算機(jī)圖形學(xué)中模擬一些特定的模糊現(xiàn)象的技術(shù),而這些現(xiàn)象是采用其它傳統(tǒng)的渲染技術(shù)難以實(shí)現(xiàn)的具有真實(shí)感的游戲圖形。經(jīng)常使用粒子系統(tǒng)模擬的現(xiàn)象可以包括但不限于:火、爆炸、煙、水流、火花、落葉、云、霧、雪、塵、流星尾跡或者如發(fā)光軌跡這樣的抽象視覺效果。由此,可以制作一個(gè)實(shí)現(xiàn)ICommonController接口的粒子控制器組件ParticleController。CommonControl的效果名對應(yīng)控制特定粒子的播放,效果參數(shù)對應(yīng)開始播放還是停止播放。示例三、可以制作一個(gè)實(shí)現(xiàn)ICommonController接口的聲音控制器組件AudioController。CommonControl的效果名對應(yīng)控制特定音效的播放,效果參數(shù)對應(yīng)開始播放還是停止播放,以及設(shè)置音效的參數(shù)。示例四、可以制作一個(gè)實(shí)現(xiàn)ICommonController接口的總體效果控制組件MainController。通過組合模式將一系列子ICommonController組件的功能組合在一起。當(dāng)CommonControl方法接收到一個(gè)調(diào)用時(shí),便可將這個(gè)調(diào)用分發(fā)給所有子ICommonController組件,于是所有相同效果名稱的效果都會被激發(fā)。例如:MainController接收到一個(gè)效果名稱叫attack的指令,那么其所有子ICommonController組件中名稱叫attack的動畫效果、粒子效果以及聲音效果都會被同時(shí)播放。這種控制方法可以使得Lua代碼更加專注于邏輯,而不必過多考慮具體效果控制。另外,效果表現(xiàn)則可以通過Unity編輯器實(shí)現(xiàn)完整定義,而不必考慮代碼編寫。5)界面相關(guān)指令(1)設(shè)置active狀態(tài)(2)設(shè)置文字(3)設(shè)置位置(4)設(shè)置大小需要說明的是,由于批量調(diào)用是為了解決高頻引擎API調(diào)用瓶頸而設(shè)計(jì)的,因此,指令設(shè)計(jì)僅包含了高頻操作,而其它使用頻率較低的跨語言調(diào)用,則仍然可以采用普通的C#與Lua互相調(diào)用的方式來實(shí)現(xiàn)。根據(jù)本發(fā)明實(shí)施例,還提供了另一種跨引擎調(diào)用方法的實(shí)施例,圖3是根據(jù)本發(fā)明實(shí)施例的另一種跨引擎調(diào)用方法的流程圖,如圖3所示,該方法包括如下步驟:步驟S32,第二引擎響應(yīng)第一引擎的調(diào)用指令,并接收來自于第一引擎的第一數(shù)據(jù)集合,其中,第一引擎采用編譯型編程語言,第二引擎采用腳本編程語言,第一數(shù)據(jù)集合包括一種或多種類型回調(diào)事件的序列化結(jié)果;步驟S34,第二引擎獲取與第一數(shù)據(jù)集合對應(yīng)的第二數(shù)據(jù)集合,其中,第二數(shù)據(jù)集合包括:對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶畹男蛄谢Y(jié)果;步驟S36,第二引擎將第二數(shù)據(jù)集合返回至第一引擎??蛇x地,在步驟S32中,第二引擎接收來自于第一引擎的第一數(shù)據(jù)集合可以包括以下執(zhí)行步驟:步驟S321,第二引擎獲取在第一引擎對一種或多種類型回調(diào)事件進(jìn)行序列化處理后得到的二進(jìn)制數(shù)據(jù)塊的內(nèi)存指針和長度;步驟S322,第二引擎根據(jù)內(nèi)存指針和長度接收第一數(shù)據(jù)集合。Lua端的批量調(diào)用管理器將回調(diào)事件分發(fā)至對應(yīng)的LuaBehaviour。在LuaBehaviour處理接收到的回調(diào)事件時(shí),LuaBehaviour也會向其所對應(yīng)的BatchedGameObject發(fā)出一些操作指令。Lua端的批量調(diào)用管理器會收集這些操作指令到批量調(diào)用隊(duì)列中。在優(yōu)選實(shí)施例中,可以使用C語言實(shí)現(xiàn)一個(gè)被稱為binaryblock的Lua模塊,只要通過Lualightuserdata傳入內(nèi)存地址,便可以將該內(nèi)存地址之后的任意內(nèi)存偏移作為8bit整數(shù),16bit整數(shù),32bit整數(shù)或32bit浮點(diǎn)數(shù)進(jìn)行解析,進(jìn)而返回Lua數(shù)值。為了減少這個(gè)Lua模塊的調(diào)用次數(shù),Lua模塊還支持直接將一段內(nèi)存作為數(shù)據(jù)進(jìn)行解析,進(jìn)而返回Lua表。另外,該Lua模塊也可以將一段內(nèi)存轉(zhuǎn)換為Luastring對象。在Lua中存在一個(gè)LuaBehaviour表,用于存儲BatchedGameObjectID與LuaBehaviour之間的映射關(guān)系。對于大部分回調(diào)事件,Lua端的批量調(diào)用管理器可以通過這個(gè)table查找到對應(yīng)的LuaBehaviour。但對于總Update事件和總FixedUpdate事件,這兩類事件是沒有指定BatchedGameObjectID的,其可以采用另外一種機(jī)制進(jìn)行分發(fā)。有一個(gè)Lua表存儲了所有處于enable狀態(tài)的LuaBehavour。總Update事件和總FixedUpdate事件會分發(fā)到這個(gè)列表中的所有LuaBehavour??蛇x地,在步驟S34中,第二引擎獲取第二數(shù)據(jù)集合可以包括以下執(zhí)行步驟:步驟S341,第二引擎從預(yù)設(shè)對應(yīng)關(guān)系中確定一種或多種類型回調(diào)事件中每個(gè)回調(diào)事件對應(yīng)的處理組件,其中,預(yù)設(shè)對應(yīng)關(guān)系中存儲有與每個(gè)回調(diào)事件歸屬的BatchedGameObject組件標(biāo)識與處理組件的對應(yīng)關(guān)系;步驟S342,第二引擎將每個(gè)回調(diào)事件分發(fā)至確定的處理組件;第二引擎獲取全部確定的處理組件反饋的操作指令,得到第二數(shù)據(jù)集合。為了簡化跨語言內(nèi)存管理,本發(fā)明優(yōu)選實(shí)施例采用了“BatchedGameObject-LuaBehaviour”高層內(nèi)存管理模式,BatchedGameObject是根據(jù)本發(fā)明實(shí)施例實(shí)現(xiàn)的一個(gè)Unity的Component,用于控制其所掛接的GameObject以及這個(gè)GameObject的所有的子GameObject。全部BatchedGameObject均存儲在C#端批量調(diào)用管理器的BatchedGameObject的字典中,其中,key為每個(gè)BatchedGameObject對應(yīng)的BatchedGameObjectID。LuaBehaviour是Lua引擎中的一個(gè)對象。Lua游戲邏輯通過LuaBehaviour來控制BatchedGameObject。全部LuaBehaviour存儲在Lua端的批量調(diào)用管理器的LuaBehaviour字典中,key為每個(gè)BatchedGameObject對應(yīng)的BatchedGameObjectID,并且具有相同的BatchedGameObjectID的LuaBehaviour與BatchedGameObject是存在一一對應(yīng)關(guān)系的。LuaBehaviour可以發(fā)送指令控制對應(yīng)的BatchedGameObject的各種行為(包括但不限于:設(shè)置Enable狀態(tài)、設(shè)置空間變換、移動Rigidbody、播放動畫、播放粒子效果、播放聲音),也可以接收與該LuaBehaviour相關(guān)的各種回調(diào)事件。另外,當(dāng)銷毀BatchedGameObject時(shí),LuaBehaviour可以從BatchedGameObject接收到銷毀(Destroy)事件,從而對自身進(jìn)行銷毀。在對Lua端的批量調(diào)用隊(duì)列進(jìn)行序列化的過程中,每個(gè)指令都可以序列化為指令標(biāo)識加指令內(nèi)容的形式。例如:如果指令的參數(shù)類型依次為:16bit整數(shù)、8bit整數(shù)、32bit整數(shù)、32bit浮點(diǎn)數(shù),那么,在序列化過程中,可以先將指令號序列化成8bit整數(shù),后面再加上指令內(nèi)容的二進(jìn)制序列化(16bit整數(shù)、8bit整數(shù)、32bit整數(shù)、32bit浮點(diǎn)數(shù))即可。使用C實(shí)現(xiàn)的Lua模塊binaryblock,可以分配一個(gè)內(nèi)存塊,并在這個(gè)內(nèi)存塊中寫入這些二進(jìn)制數(shù)據(jù)。然而,如果直接將上述混雜在一起的不同類型的指令序列化,然后按順序緊密排列,那么便會造成大量數(shù)據(jù)內(nèi)存不對齊,進(jìn)而降低數(shù)據(jù)讀寫效率,這對于運(yùn)行效率需求較高的批量調(diào)用而言,需要在很短時(shí)間內(nèi)實(shí)現(xiàn)大量指令的序列化與反序列化。于是,在本發(fā)明優(yōu)選實(shí)施例中,可以使用混雜指令內(nèi)存對齊方式以使得這些混雜的指令能夠?qū)崿F(xiàn)內(nèi)存對齊??蛇x地,在步驟S342中,第二引擎獲取全部確定的處理組件反饋的操作指令,得到第二數(shù)據(jù)集合可以包括以下執(zhí)行步驟:步驟S3421,第二引擎將獲取到的每條操作指令序列化成指令標(biāo)識和指令參數(shù)的組合方式,其中,指令標(biāo)識用于指示待調(diào)用的函數(shù),指令參數(shù)用于指示在待調(diào)用的函數(shù)中待操作的參數(shù);步驟S3422,第二引擎按照序列化后操作指令的數(shù)據(jù)類型執(zhí)行內(nèi)存對齊操作,得到第二數(shù)據(jù)集合。Lua如果需要對BatchedGameObject進(jìn)行操作,都需要通過調(diào)用batchcall模塊提供的批量調(diào)用函數(shù)來操作。這些函數(shù)的第一個(gè)參數(shù)均為BatchedGameObjectID,用于指定需要操作的對應(yīng)BatchedGameObject,后續(xù)幾個(gè)參數(shù)則為實(shí)際操作參數(shù)。例如:設(shè)置位置的函數(shù)可以采用bc_transform_set_position(batch_id,x,y,z)。這個(gè)函數(shù)所要執(zhí)行的操作即為將相應(yīng)的調(diào)用指定存入批量調(diào)用隊(duì)列。每個(gè)批量調(diào)用的信息中的必須參數(shù)可以包括但不限于:(1)CommandID,用于表明其所調(diào)用的對應(yīng)函數(shù);(2)BatchedGameObjectID,用于表明其所操作的對應(yīng)BatchedGameObject。需要說明的是,上述批量調(diào)用過程是需要保持調(diào)用順序的,因此,不同類型的調(diào)用需要混合在一起,并按先后順序存儲于同一個(gè)隊(duì)列中。另外,還需要說明的是,批量調(diào)用的信息流永遠(yuǎn)是從Lua發(fā)送至C#。因此,盡量不要讓Lua讀取引擎中的Transform、Rigidbody的位置、角度等數(shù)據(jù),而是將位置、角度等數(shù)據(jù)存儲在Lua中,以使這些數(shù)據(jù)只從Lua傳輸至C#中,而不是從C#反向傳輸至Lua。如果確實(shí)需要Lua讀取引擎中的Transform、Rigidbody的位置、角度等數(shù)據(jù),則可以通過現(xiàn)有的Lua調(diào)用C#的方式來讀取。但是務(wù)必將這種操作的次數(shù)將至最低,否則會影響程序運(yùn)行效率。Rigidbody是一種Component,由Unity內(nèi)置提供,其可以實(shí)現(xiàn)慣性物理效果,也是物理碰撞檢測所必需的Component。對于Rigidbody而言,其位置可能會受到碰撞影響,由此易造成與Lua中存儲的位置信息不同步。為此,可以在物理碰撞回調(diào)信息中包含Rigidbody的位置,LuaBehaviour接收到物理碰撞回調(diào)后便可調(diào)整其內(nèi)部記錄的位置信息。這樣便能夠確保Lua中的Rigidbody位置信息與引擎中的Rigidbody位置完全同步。圖4是根據(jù)本發(fā)明優(yōu)選實(shí)施例的混雜指令內(nèi)存對齊方式的示意圖。如圖4所示,為了便于說明上述混雜指令內(nèi)存對齊方式,此處使用一個(gè)字母加一個(gè)數(shù)字來代表一個(gè)二進(jìn)制數(shù)據(jù)基本元素,其中,首字母B代表8bit整數(shù)、首字母h代表16bit整數(shù)、首字母i代表32bit整數(shù)、首字母f代表32bit浮點(diǎn)數(shù),第二個(gè)字符的數(shù)字用于區(qū)分不同的數(shù)據(jù)塊。假設(shè)有三個(gè)指令需要序列化:(1)B1h1B2i1f1,(2)B3h2f2h3和(3)B4B5i2;直接得到的序列化結(jié)果便是直接將上述三個(gè)指令進(jìn)行連接,由此得到:B1h1B2i1f1B3h2f2h3B4B5i2。而如果采用上述混雜指令內(nèi)存對齊方式,則會將上述三個(gè)指令按照不同基本數(shù)據(jù)類型分類分別進(jìn)行排列,由此得到:B1B2B3B4B5,h1h2h3,i1i2,f1f2。然后,再按照寬數(shù)據(jù)類型到窄數(shù)據(jù)類型將這四個(gè)隊(duì)列進(jìn)行連接,繼而得到f1f2i1i2h1h2h3B1B2B3B4B5。最終實(shí)現(xiàn)所有數(shù)據(jù)的內(nèi)存對齊。讀取每個(gè)指令時(shí)都是先讀取指令標(biāo)識,再讀取指令參數(shù)。而每個(gè)指令標(biāo)識所對應(yīng)的參數(shù)類型是固定的。例如:指令標(biāo)識i2,規(guī)定其指令參數(shù)的類型依次為16bit整數(shù)、8bit整數(shù)、32bit整數(shù)、32bit浮點(diǎn)數(shù),則在執(zhí)行反序列化操作的過程中,一旦讀取到指令標(biāo)識i2,那么接下來就一定需要按順序讀取出16bit整數(shù)、8bit整數(shù)、32bit整數(shù)、32bit浮點(diǎn)數(shù)這4個(gè)類型的參數(shù)。由此反復(fù)執(zhí)行讀取指令標(biāo)識、讀取指令參數(shù)、讀取指令標(biāo)識、讀取指令參數(shù)……,便可以按順序反序列化出所有的指令,其相當(dāng)于所有基本數(shù)據(jù)類型的讀取順序都是可知的。這個(gè)讀取方式對于直接序列化得到的二進(jìn)制序列和混雜指令內(nèi)存對齊之后的二進(jìn)制序列,都是有效的。以圖4為例,可以先從8bit整數(shù)隊(duì)列中讀取出B1,此時(shí)便能夠推斷出這條指令的參數(shù)類型為16bit整數(shù)、8bit整數(shù)、32bit整數(shù)、32bit浮點(diǎn)數(shù),接下來按序執(zhí)行:從32bit整數(shù)隊(duì)列中取出h1、從8bit整數(shù)隊(duì)列取出B2、從32bit整數(shù)隊(duì)列中取出i1以及從32bit浮點(diǎn)數(shù)隊(duì)列中取出f1,于是這條指令就被成功反序列化??蛇x地,在步驟S36中,第二引擎將第二數(shù)據(jù)集合返回至第一引擎可以包括以下執(zhí)行步驟:步驟S361,第二引擎獲取通過對所述一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶钸M(jìn)行序列化處理得到的序列化結(jié)果的內(nèi)存地址和長度數(shù)據(jù);步驟S362,第二引擎將內(nèi)存地址和長度數(shù)據(jù)返回至第一引擎。在將Lua中的二進(jìn)制數(shù)據(jù)返回至C#的過程中,假設(shè)已經(jīng)將序列化結(jié)果存儲至binaryblock模塊所創(chuàng)建的內(nèi)存塊中,此時(shí)便可以采用Lualightuserdata表示這塊內(nèi)存的地址以及采用數(shù)字表示這塊內(nèi)存的大小,這兩個(gè)數(shù)據(jù)可以作為Lua端的批量調(diào)用管理器入口函數(shù)的返回值以返回至C#端的批量調(diào)用管理器。由此,C#端的批量調(diào)用管理器便可以通過Lua的CAPI函數(shù)lua_topointer將Lualightuserdata轉(zhuǎn)換成內(nèi)存指針,繼而使用C#的unsafe功能,可以直接從上述內(nèi)存指針指向的內(nèi)存中讀取出相關(guān)數(shù)據(jù)。根據(jù)本發(fā)明實(shí)施例,提供了一種跨引擎調(diào)用裝置的實(shí)施例,圖5是根據(jù)本發(fā)明實(shí)施例的一種跨引擎調(diào)用裝置的流程圖,如圖5所示,該裝置包括:第一獲取模塊50,用于獲取第一數(shù)據(jù)集合,其中,第一引擎采用編譯型編程語言,第一數(shù)據(jù)集合包括一種或多種類型回調(diào)事件的序列化結(jié)果;處理模塊52,用于向第二引擎?zhèn)魅氲谝粩?shù)據(jù)集合,其中,第二引擎采用腳本編程語言;接收模塊54,用于接收來自于第二引擎的第二數(shù)據(jù)集合,其中,第二數(shù)據(jù)集合包括:對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶畹男蛄谢Y(jié)果。在優(yōu)選實(shí)施過程中,上述一種或多種類型回調(diào)事件可以包括但不限于以下至少之一:(1)幀事件;(2)游戲?qū)ο笊芷谑录?3)物理事件;(4)界面操作事件??蛇x地,第一獲取模塊50可以包括:第一獲取單元(圖中未示出),用于獲取待操作的一個(gè)或多個(gè)BatchedGameObject組件;收集單元(圖中未示出),用于分別收集與每種BatchedGameObject組件對應(yīng)的回調(diào)事件,并分別對收集到的回調(diào)事件進(jìn)行序列化處理,得到待拼接的序列化結(jié)果;第二獲取單元(圖中未示出),用于將得到的與每種BatchedGameObject組件對應(yīng)的待拼接的序列化結(jié)果進(jìn)行拼接,獲取第一數(shù)據(jù)集合,其中,第一數(shù)據(jù)集合記錄每個(gè)回調(diào)事件所歸屬的BatchedGameObject組件。可選地,第一獲取模塊50還可以包括:第三獲取單元(圖中未示出),用于獲取當(dāng)前存在的全部幀事件,其中,幀事件包括以下至少之一:Update事件、FixedUpdate事件;第四獲取單元(圖中未示出),用于將獲取到的幀事件拼接至第一數(shù)據(jù)集合??蛇x地,處理模塊52,用于運(yùn)行啟動腳本后得到第二引擎入口函數(shù),并調(diào)用第二引擎入口函數(shù),向第二引擎?zhèn)魅氲谝粩?shù)據(jù)集合??蛇x地,處理模塊52可以包括:第一處理單元(圖中未示出),用于對一種或多種類型回調(diào)事件執(zhí)行序列化操作,得到二進(jìn)制數(shù)據(jù)塊;第二處理單元(圖中未示出),用于將二進(jìn)制數(shù)據(jù)塊的內(nèi)存指針和長度傳入第二引擎。可選地,圖6是根據(jù)本發(fā)明優(yōu)選實(shí)施例的一種跨引擎調(diào)用裝置的流程圖,如圖6所示,上述裝置還可以包括:第二獲取模塊56,用于從第二數(shù)據(jù)集合中獲取對BatchedGameObject組件的操作指令;分發(fā)模塊58,用于分別確定每條操作指令對應(yīng)的BatchedGameObject組件,并將每條操作指令分發(fā)至對應(yīng)的BatchedGameObject組件。根據(jù)本發(fā)明實(shí)施例,還提供了另一種跨引擎調(diào)用裝置的實(shí)施例,圖7是根據(jù)本發(fā)明實(shí)施例的另一種跨引擎調(diào)用裝置的流程圖,如圖7所示,該裝置包括:處理模塊70,用于接收來自于第一引擎的第一數(shù)據(jù)集合,其中,第一引擎采用編譯型編程語言,第二引擎采用腳本編程語言,第一數(shù)據(jù)集合包括一種或多種類型回調(diào)事件的序列化結(jié)果;獲取模塊72,用于獲取與第一數(shù)據(jù)集合對應(yīng)的第二數(shù)據(jù)集合,其中,第二數(shù)據(jù)集合包括:對一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶畹男蛄谢Y(jié)果;反饋模塊74,用于將第二數(shù)據(jù)集合返回至第一引擎??蛇x地,處理模塊70可以包括:第一獲取單元(圖中未示出),用于獲取在第一引擎對一種或多種類型回調(diào)事件進(jìn)行序列化處理后得到的二進(jìn)制數(shù)據(jù)塊的內(nèi)存指針和長度;接收單元(圖中未示出),用于根據(jù)內(nèi)存指針和長度接收第一數(shù)據(jù)集合。可選地,獲取模塊72可以包括:第一確定單元(圖中未示出),用于從預(yù)設(shè)對應(yīng)關(guān)系中確定一種或多種類型回調(diào)事件中每個(gè)回調(diào)事件對應(yīng)的處理組件,其中,預(yù)設(shè)對應(yīng)關(guān)系中存儲有與每個(gè)回調(diào)事件歸屬的BatchedGameObject組件標(biāo)識與處理組件的對應(yīng)關(guān)系;分發(fā)單元(圖中未示出),用于將每個(gè)回調(diào)事件分發(fā)至確定的處理組件;第二獲取單元(圖中未示出),用于獲取全部確定的處理組件反饋的操作指令,得到第二數(shù)據(jù)集合??蛇x地,第二獲取單元可以包括:處理子單元(圖中未示出),用于將獲取到的每條操作指令序列化成指令標(biāo)識和指令參數(shù)的組合方式,其中,指令標(biāo)識用于指示待調(diào)用的函數(shù),指令參數(shù)用于指示在待調(diào)用的函數(shù)中待操作的參數(shù);獲取子單元(圖中未示出),用于按照序列化后操作指令的數(shù)據(jù)類型執(zhí)行內(nèi)存對齊操作,得到第二數(shù)據(jù)集合。可選地,反饋模塊74可以包括:第二確定單元(圖中未示出),用于獲取通過對所述一個(gè)或多個(gè)游戲?qū)ο蟮牟僮髦噶钸M(jìn)行序列化處理得到的序列化結(jié)果的內(nèi)存地址和長度數(shù)據(jù);反饋單元(圖中未示出),用于將內(nèi)存地址和長度數(shù)據(jù)返回至第一引擎。與相關(guān)技術(shù)中所提供的技術(shù)方案相比,通過本發(fā)明實(shí)施例所提供的批量調(diào)用方式,可以直接減少Lua與C#之間的調(diào)用次數(shù),從而降低跨語言調(diào)用的時(shí)間消耗,進(jìn)而使得游戲邏輯可以完全采用Lua編寫,繼而使得更新游戲邏輯和資源變得即為便利;無需重新編譯App,而只需重新啟動即可更新任意游戲邏輯和資源;在開發(fā)游戲的過程中,可以迅速在移動終端上觀看試運(yùn)行效果,以減少測試反饋時(shí)間,加快開發(fā)進(jìn)度;在游戲發(fā)布之后,可以繞過App發(fā)布直接通過補(bǔ)丁來更新和修復(fù)游戲中存在的bug,以增加游戲產(chǎn)品的改進(jìn)速度。上述本發(fā)明實(shí)施例序號僅僅為了描述,不代表實(shí)施例的優(yōu)劣。在本發(fā)明的上述實(shí)施例中,對各個(gè)實(shí)施例的描述都各有側(cè)重,某個(gè)實(shí)施例中沒有詳述的部分,可以參見其他實(shí)施例的相關(guān)描述。在本申請所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的技術(shù)內(nèi)容,可通過其它的方式實(shí)現(xiàn)。其中,以上所描述的裝置實(shí)施例僅僅是示意性的,例如所述單元的劃分,可以為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來實(shí)現(xiàn)本實(shí)施例方案的目的。另外,在本發(fā)明各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能單元的形式實(shí)現(xiàn)。所述集成的單元如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲在一個(gè)計(jì)算機(jī)可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲在一個(gè)存儲介質(zhì)中,包括若干指令用以使得一臺計(jì)算機(jī)設(shè)備(可為個(gè)人計(jì)算機(jī)、服務(wù)器或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:U盤、只讀存儲器(ROM,Read-OnlyMemory)、隨機(jī)存取存儲器(RAM,RandomAccessMemory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對于本
技術(shù)領(lǐng)域:
:的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。當(dāng)前第1頁1 2 3 當(dāng)前第1頁1 2 3