[0028]第一種方法需要對(duì)現(xiàn)有游戲客戶端進(jìn)行修改,在云游戲的現(xiàn)有邏輯代碼中加入鍵盤鼠標(biāo)消息的接收和處理模塊,不具有通用性。
[0029]第二種方法在服務(wù)器的系統(tǒng)層進(jìn)行,對(duì)系統(tǒng)全局的鍵盤鼠標(biāo)狀態(tài)都有影響,當(dāng)服務(wù)器上運(yùn)行多個(gè)Tracer端時(shí),多個(gè)Tracer端會(huì)相互影響,導(dǎo)致每臺(tái)服務(wù)器只能提供一個(gè)Tracer端,不能充分利用服務(wù)器資源。
[0030]為解決上述問(wèn)題,本發(fā)明實(shí)施例提供一種遠(yuǎn)程重定向方法和裝置,用于支持在服務(wù)器上運(yùn)行多個(gè)Trace端且不用修改Trace端的現(xiàn)有邏輯代碼。下面通過(guò)具體實(shí)施例,分別進(jìn)行詳細(xì)的說(shuō)明。
[0031](實(shí)施例一、)
[0032]請(qǐng)參考圖4,本發(fā)明實(shí)施例提供的一種遠(yuǎn)程重定向方法,所述方法應(yīng)用于云交互系統(tǒng),所述云交互系統(tǒng)包括服務(wù)器和用戶設(shè)備,所述服務(wù)器中運(yùn)行有至少一個(gè)交互式應(yīng)用的至少一個(gè)Tracer端,第一Tracer端是所述至少一個(gè)Tracer端中的任一Tracer端;所述云交互系統(tǒng)運(yùn)行的交互式應(yīng)用可以是云游戲,此時(shí)云交互系統(tǒng)也可以稱為云游戲系統(tǒng),本文以云游戲系統(tǒng)為例進(jìn)行說(shuō)明。
[0033]所述方法可以包括:
[0034]110、所述服務(wù)器獲取所述用戶設(shè)備側(cè)的輸入裝置的控制操作。
[0035]所述服務(wù)器可以通過(guò)接收所述用戶設(shè)備發(fā)送的、封裝有所述用戶設(shè)備側(cè)的輸入裝置的控制操作的消息,并解析收到的消息,來(lái)獲取所述用戶設(shè)備側(cè)的輸入裝置的控制操作。所述輸入裝置可以包括鍵盤、鼠標(biāo)、手柄、觸摸屏等裝置中的一種或多種。
[0036]120、根據(jù)所述控制操作更新第一狀態(tài)表,所述第一狀態(tài)表用于所述第一 Tracer端記錄所述用戶設(shè)備側(cè)的輸入裝置的操作狀態(tài)。
[0037]本發(fā)明實(shí)施例中,在每個(gè)Tracer端增加一個(gè)狀態(tài)表,該狀態(tài)表專門用于記錄所述用戶設(shè)備側(cè)的輸入裝置的操作狀態(tài)。以第一Tracer端為例,增加的狀態(tài)表記為第一狀態(tài)表。第一 Tracer端每次獲取到用戶設(shè)備側(cè)的輸入裝置的控制操作,都對(duì)第一狀態(tài)表進(jìn)行更新,使得Tracer端和Retracer端各自記錄的輸入裝置例如鍵盤鼠標(biāo)的操作狀態(tài)同步。該第一狀態(tài)表可以是僅用于記錄用戶設(shè)備側(cè)的輸入裝置的操作狀態(tài),而不記錄其它輸入裝置的操作狀態(tài)。
[0038]130、根據(jù)所述控制操作生成相應(yīng)的控制消息,將所述控制消息傳遞給所述第一Tracer^Mo
[0039]服務(wù)器每次獲取到用戶設(shè)備側(cè)的輸入裝置的控制操作,除了更新第一狀態(tài)表,同時(shí),還根據(jù)所述控制操作生成相應(yīng)的控制消息,將所述控制消息傳遞給所述第一 Tracer端,具體的,可以傳遞給所述第一Tracer端的消息處理函數(shù),用于被第一Tracer端的處理邏輯處理。
[°04°] 140、將所述第一 Tracer端的用于獲取輸入裝置的操作狀態(tài)的指令,采用Hook技術(shù)重定向到所述第一狀態(tài)表,以便所述第一Tracer端根據(jù)所述控制消息和所述第一狀態(tài)表進(jìn)行邏輯處理。
[0041]本發(fā)明實(shí)施例中,對(duì)第一Tracer端的用于獲取輸入裝置例如鍵盤鼠標(biāo)的操作狀態(tài)的指令采用Hook技術(shù)進(jìn)行重定向到所述第一狀態(tài)表。第一Tracer端進(jìn)行邏輯處理時(shí),根據(jù)所述控制消息和所述第一狀態(tài)表進(jìn)行。
[0042]其中,所說(shuō)的指令具體可以是API(Applicat1n Programming Interface,應(yīng)用程序編程接口)。所說(shuō)的Hook技術(shù)是指:把原本的函數(shù)執(zhí)行過(guò)程替換成自定義的函數(shù),Hook可以接觸到需要修改的Api函數(shù)入口點(diǎn),改變它的地址指向新的自定義的函數(shù)。
[0043]為了實(shí)現(xiàn)將獲取輸入裝置的操作狀態(tài)的指令Hook到第一狀態(tài)表,可以采用雙重重定向,首先Hook到游戲的主線程中,再Hook到用于獲取輸入裝置的操作狀態(tài)的API。于是,一些實(shí)施例中,本步驟具體可以包括:
[0044]采用Hook技術(shù)注入到所述第一 Tracer端的主線程;
[0045]在所述主線程中,再對(duì)所述第一Tracer端的用于獲取輸入裝置的操作狀態(tài)的API進(jìn)行Hook,使得所述第一 Tracer端的用于獲取輸入裝置的操作狀態(tài)的指令被重定向到所述第一狀態(tài)表。其中,所述系統(tǒng)API例如可以是用于顯示鼠標(biāo)的API,或者也可以采用其它的API。
[0046]其中,采用Hook技術(shù)注入到第一Tracer端的主線程的步驟具體可以包括:對(duì)所述第一Tracer端的主線程會(huì)調(diào)用的一個(gè)系統(tǒng)API進(jìn)行Hook;當(dāng)所述系統(tǒng)API被調(diào)用時(shí),注入到所述主線程。
[0047]值得說(shuō)明的是,這里可以有兩次Hook,第一次Hook是對(duì)游戲主線程會(huì)調(diào)用的系統(tǒng)API進(jìn)行Hook,目的是注入游戲主線程;第二次Hook是當(dāng)成功注入游戲主線程之后,在游戲主線程中對(duì)調(diào)用的系統(tǒng)獲取輸入裝置的操作狀態(tài)例如獲取鍵鼠狀態(tài)的API進(jìn)行Hook,目的是重定向到Tracer端保存的第一狀態(tài)表。
[0048]這里所說(shuō)的系統(tǒng)API是指游戲主線程一定會(huì)調(diào)用到的系統(tǒng)API,這是因?yàn)椴徽莆沼螒蛑鬟M(jìn)程的源代碼的基礎(chǔ)上,要注入到游戲主線程中,只能預(yù)判游戲主線程一定會(huì)調(diào)用到什么系統(tǒng)API,通過(guò)對(duì)該系統(tǒng)API的HOOK,進(jìn)而注入游戲主線程,達(dá)到對(duì)游戲主線程的控制。
[0049]舉例來(lái)說(shuō),所述系統(tǒng)API可以是用于顯示光標(biāo)的API,即ShowCursor API;或者用于創(chuàng)建窗口的API,即,CreateWindow API。但必須注意,并不限于以上列舉的兩種API。
[0050]由上可見(jiàn),本發(fā)明實(shí)施例中,提供了一種遠(yuǎn)程重定向方法,該方法采用Hook技術(shù)實(shí)現(xiàn)重定向,不用修改Trace端的現(xiàn)有邏輯代碼;各個(gè)Tracer端使用各自的鍵盤鼠標(biāo)狀態(tài)表,且重定向過(guò)程在Tracer端內(nèi)部完成,因此,各個(gè)Tracer端的遠(yuǎn)程重定向操作不會(huì)互相影響,從而支持在服務(wù)器上運(yùn)行多個(gè)交互式應(yīng)用的多個(gè)Tracer端。
[0051 ]請(qǐng)參考圖5,是本發(fā)明實(shí)施例中一種云交互系統(tǒng)的架構(gòu)圖。云交互式系統(tǒng)可以理解為是云游戲系統(tǒng)。
[0052]下面,結(jié)合系統(tǒng)架構(gòu)圖對(duì)本發(fā)明實(shí)施例技術(shù)方案做進(jìn)一步詳細(xì)的說(shuō)明:
[0053]如圖5所示,用戶設(shè)備上運(yùn)行有Retracer端,服務(wù)器上可運(yùn)行有多個(gè)Tracer端。用戶設(shè)備和服務(wù)器都有各自的輸入裝置,所述輸入裝置可以包括鍵盤、鼠標(biāo)、手柄、觸摸屏等裝置中的一種或多種。下面以輸入裝置包括鍵盤和鼠標(biāo)為例,用“鍵盤鼠標(biāo)”指代輸入裝置,“鍵盤鼠標(biāo)”可以理解為鍵盤和/或鼠標(biāo)。但需要說(shuō)明的是,“鍵盤鼠標(biāo)”也可以替換成其它任意的輸入裝置。
[0054]在用戶設(shè)備側(cè),Retracer端可以通過(guò)消息處理函數(shù),從系統(tǒng)消息隊(duì)列中,獲取和記錄用戶對(duì)Re tracer端的鍵盤鼠標(biāo)控制操作。Retracer端可以通過(guò)消息封裝函數(shù)例如鍵鼠消息封裝函數(shù),將獲取的鍵盤鼠標(biāo)控制操作,封裝成消息,并發(fā)送到Tracer端。
[0055]在服務(wù)器側(cè),Tracer端可以通過(guò)鍵鼠消息解析函數(shù),接收并解析Retracer端發(fā)送的消息,獲取用戶設(shè)備側(cè)的鍵盤鼠標(biāo)控制操作,并重新生成對(duì)應(yīng)的控制消息傳遞給消息處理函數(shù)。
[0056]本發(fā)明實(shí)施例中,在Tracer端利用一個(gè)專用的狀態(tài)表來(lái)記錄所述用戶設(shè)備側(cè)的鍵盤鼠標(biāo)的操作狀態(tài),即上文所述的第一狀態(tài)表,Tracer端每次獲取到用戶設(shè)備側(cè)的鍵盤鼠標(biāo)控制操作,都對(duì)第一狀態(tài)表進(jìn)行更新,保證該第一狀態(tài)表和用戶設(shè)備側(cè)的鍵盤鼠標(biāo)的操作狀態(tài)同步。
[0057]在服務(wù)器側(cè),還對(duì)Tracer端的用于獲取鍵盤鼠標(biāo)狀態(tài)的API進(jìn)行Hook,將Tracer端處理邏輯中獲取鍵盤鼠標(biāo)的操作狀態(tài)重定向到Tracer端保存的第一狀態(tài)表記錄的用戶設(shè)備側(cè)的鍵盤鼠標(biāo)的操作狀態(tài)。
[0058]于是,Trac