專利名稱:網(wǎng)絡(luò)游戲中的射線查詢方法和場景服務(wù)器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及網(wǎng)絡(luò)游戲技術(shù),特別涉及網(wǎng)絡(luò)游戲中的射線查詢方法和場景服務(wù)器。
背景技術(shù):
碰撞檢測是網(wǎng)絡(luò)游戲中實現(xiàn)很多游戲效果和技術(shù)的基礎(chǔ),其中以射線查詢應(yīng)用最為廣泛。所謂射線查詢,其主要是使用射線作碰撞檢測,查詢空間中的射線是否與場景模型相交,如果相交則返回最近的交點等信息。例如《刀劍貳》中的跳躍、尋路、傷害判定等,都需要進行大量射線查詢。 通常,網(wǎng)絡(luò)游戲中用于射線查詢的場景模型使用三角形網(wǎng)格表示,有時復(fù)雜的場景模型可能使用數(shù)十萬乃至百萬個三角形網(wǎng)格。為了加速計算,常常針對場景模型使用加速結(jié)構(gòu)即kdtree、均勻網(wǎng)格等數(shù)據(jù)結(jié)構(gòu),其對空間進行劃分,并將三角形劃分到其覆蓋的各個子空間,檢測時只查找射線穿過的子空間,避免不必要的射線與三角形相交測試。但即使使用加速結(jié)構(gòu),射線查詢也需要大量的計算。為了防止欺詐或外掛,更好的維護玩家權(quán)益,越來越多的網(wǎng)絡(luò)游戲?qū)⑸婕袄娴纳渚€查詢放在服務(wù)器端計算,通常是由場景服務(wù)器的(PU執(zhí)行。但是,場景服務(wù)器的CPU負(fù)責(zé)運行多個場景,包括世界和副本等,支持?jǐn)?shù)以千計的玩家同時在線,毎秒運行數(shù)十個游戲幀,而每一游戲幀通常需要處理網(wǎng)絡(luò)請求、人工智能、傷害判定、尋路、日志等大量任務(wù),如果在額定的時間內(nèi)不能完成任務(wù),導(dǎo)致服務(wù)器延遲,不僅影響玩家體驗,還會影響后續(xù)游戲幀的處理,導(dǎo)致各種問題。和其它任務(wù)相比,射線查詢不僅計算密集,而且?guī)g負(fù)載不平衡,在某一游戲幀只有少量的查詢,而下ー游戲幀就可能出現(xiàn)數(shù)百倍乃至千倍的查詢,常常導(dǎo)致服務(wù)器延遲。
發(fā)明內(nèi)容
本發(fā)明提供了網(wǎng)絡(luò)游戲中的射線查詢方法和場景服務(wù)器,以避免射線查詢引起場景服務(wù)器的延遲。本發(fā)明提供的技術(shù)方案包括一種網(wǎng)絡(luò)游戲中的射線查詢方法,方法包括場景服務(wù)器針對每ー游戲幀執(zhí)行以下操作在每ー游戲幀開始時,將針對該游戲幀的所有射線查詢請求注冊到射線查詢管理器中;依據(jù)注冊至該射線查詢管理器的射線查詢請求數(shù)量統(tǒng)計出當(dāng)前是由CPU還是由圖像處理器GPU執(zhí)行射線查詢;如果統(tǒng)計出是由CPU執(zhí)行射線查詢,則由CPU執(zhí)行射線查詢;如果統(tǒng)計出是由GPU執(zhí)行射線查詢,則調(diào)度GPU異步執(zhí)行射線查詢,而CPU在GPU執(zhí)行射線查詢期間執(zhí)行非射線查詢?nèi)蝿?wù)。一種應(yīng)用于網(wǎng)絡(luò)游戲中射線查詢的場景服務(wù)器,包括注冊單元,用于當(dāng)每一游戲幀開始時,將針對該游戲幀的所有射線查詢請求注冊到射線查詢管理器中;統(tǒng)計單元,用于依據(jù)注冊至該射線查詢管理器的射線查詢請求數(shù)量統(tǒng)計出當(dāng)前是由CPU還是由圖像處理器GPU執(zhí)行射線查詢;CPU,用于在所述統(tǒng)計單元統(tǒng)計出是由CPU執(zhí)行射線查詢時,執(zhí)行射線查詢;GPU,用于在所述統(tǒng)計單元統(tǒng)計出是由GPU執(zhí)行射線查詢吋,異步執(zhí)行射線查詢,其中,所述CPU在GPU執(zhí)行射線查詢期間執(zhí)行非射線查詢?nèi)蝿?wù)。由以上技術(shù)方案可以看出,本發(fā)明中,依據(jù)每ー游戲幀開始時注冊至該射線查詢管理器的該游戲幀的所有射線查詢請求數(shù)量統(tǒng)計出當(dāng)前是由CPU還是由圖像處理器GPU執(zhí)行射線查詢,如果統(tǒng)計出是由CPU執(zhí)行射線查詢,則由CPU執(zhí)行射線查詢,如果統(tǒng)計出是由GPU執(zhí)行射線查詢,則調(diào)度GPU異步執(zhí)行射線查詢,而CPU在GPU執(zhí)行射線查詢期間執(zhí)行非射線查詢?nèi)蝿?wù),這是實現(xiàn)了并非一直由場景服務(wù)器的CPU執(zhí)行射線查詢?nèi)蝿?wù),而GPU也可協(xié)助執(zhí)行射線查詢?nèi)蝿?wù),這保證了場景服務(wù)器的流暢運行,避免射線查詢引起場景服務(wù)器的 延遲。
圖I為GPU效果示意圖;圖2為本發(fā)明實施例提供的方法流程圖;圖3為本發(fā)明實施例提供的CPU計算時間和數(shù)據(jù)傳輸時間測試示意圖;圖4為本發(fā)明實施例提供的詳細(xì)方法流程圖;圖5為本發(fā)明實施例提供的數(shù)據(jù)存儲格式示意圖;圖6為本發(fā)明實施例提供的GPU執(zhí)行射線查詢流程圖;圖7為本發(fā)明實施例提供的查詢數(shù)據(jù)和線程塊數(shù)據(jù)示意圖;圖8為本發(fā)明實施例提供的場景服務(wù)器結(jié)構(gòu)圖。
具體實施例方式為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面結(jié)合附圖和具體實施例對本發(fā)明進行詳細(xì)描述。隨著對圖形處理能力的需求不斷增長,圖形處理器(GPU)得到了飛速發(fā)展。該GPU具有大量數(shù)據(jù)并行處理、計算密集的特點,其與CPU上大部分面積都被緩存占據(jù)有所不同,目前,GPU上有大約80%的晶體管用作運算,因此,GPU在密集型計算上比CPU更有優(yōu)勢,擁有更高的浮點計算能力,具體如圖I所示?;诖耍景l(fā)明可由GPU作為CPU的協(xié)處理器異步執(zhí)行射線查詢,具體見圖2所
/Jn ο參見圖2,圖2為本發(fā)明實施例提供的方法流程圖。如圖2所示,該流程可包括步驟201,場景服務(wù)器針對每ー游戲幀執(zhí)行步驟202至步驟204。步驟202,在每ー游戲幀開始時,將針對該游戲幀的所有射線查詢請求注冊到射線查詢管理器中;步驟203,依據(jù)注冊至該射線查詢管理器的射線查詢請求數(shù)量統(tǒng)計出當(dāng)前是由CPU還是由GPU執(zhí)行射線查詢。
步驟204,如果步驟203統(tǒng)計出是由CPU執(zhí)行射線查詢,則由CPU執(zhí)行射線查詢;如果步驟203統(tǒng)計出是由圖像處理器GPU執(zhí)行射線查詢,則調(diào)度GPU異步執(zhí)行射線查詢,而CPU在GPU執(zhí)行射線查詢期間執(zhí)行非射線查詢?nèi)蝿?wù)。至此,完成圖2所示方法的描述。其中,步驟203之所以統(tǒng)計出當(dāng)前是由CPU還是由GPU執(zhí)行射線查詢,主要是因為雖然GPU可異步執(zhí)行射線查詢,但其需要與內(nèi)存通過PCI-E總線通信,以便從內(nèi)存復(fù)制用于執(zhí)行射線查詢的查詢數(shù)據(jù)到顯存(GPU的全局存儲),以及還需要從顯存復(fù)制執(zhí)行射線查詢的結(jié)果到內(nèi)存,這都需要時間,為便于描述,將該時間簡稱為數(shù)據(jù)傳輸時間。根據(jù)本申請發(fā)明人的測試,只有該數(shù)據(jù)傳輸時間小于由CPU執(zhí)行射線查詢所需要的時間(簡稱為CPU計算時間)時,使用GPU執(zhí)行射線查詢才有意義,比如提高射線查詢速度。因此,在執(zhí)行射線查詢時就需要從提高射線查詢速度角度細(xì)分是由CPU還是由GPU執(zhí)行射線查詢。通常,CPU計算時間基本上與射線查詢的數(shù)量成正比,而數(shù)據(jù)傳輸時間雖然隨著傳輸數(shù)據(jù)大小的增加而增加,不過與傳輸數(shù)據(jù)大小并不成正比,增長較慢。本申請發(fā)明人以 NIVIDA GTX460顯卡為例測試數(shù)據(jù)傳輸時間與CPU計算時間具體如圖3所示。從圖3可以看出,從射線查詢請求的數(shù)量為16開始,CPU計算時間大于數(shù)據(jù)傳輸時間,因此可以得到當(dāng)射線查詢請求的數(shù)量小于16時使用CPU執(zhí)行射線查詢,而當(dāng)大于等于16使用GPU異步執(zhí)行射線查詢,這能夠保證射線查詢速度最快。由于服務(wù)器的硬件配置不同,CPU計算時間等于或開始大于上述數(shù)據(jù)傳輸時間的射線查詢請求數(shù)量N不同。為了獲取N,本發(fā)明在場景服務(wù)器啟動時,載入ー組預(yù)先生成的查詢數(shù)據(jù),取查詢數(shù)據(jù)的數(shù)量為2k,從k=2開始依次測試CPU計算時間和數(shù)據(jù)傳輸時間,當(dāng)測試結(jié)果為(PU計算時間等于或開始大于上述數(shù)據(jù)傳輸時間時,確定當(dāng)前已使用的查詢數(shù)據(jù)的數(shù)量為所述N。另外,根據(jù)步驟204的描述可以看出,場景服務(wù)器的CPU執(zhí)行的任務(wù)分成如下兩類射線查詢?nèi)蝿?wù)和非射線查詢?nèi)蝿?wù)。其中,當(dāng)統(tǒng)計出是由CPU執(zhí)行射線查詢時,則由CPU執(zhí)行射線查詢?nèi)蝿?wù)。而當(dāng)統(tǒng)計出由GPU執(zhí)行射線查詢吋,就調(diào)度GPU異步執(zhí)行射線查詢,而CPU在GPU執(zhí)行射線查詢期間執(zhí)行非射線查詢?nèi)蝿?wù),這不僅能提高場景服務(wù)器計算射線查詢的速度,而且能提高服務(wù)器處理任務(wù)的呑吐量。下面通過圖4對圖2所示流程進行詳細(xì)描述參見圖4,圖4為本發(fā)明實施例提供的詳細(xì)方法流程圖。如圖4所示,該流程可包括以下步驟步驟401,場景服務(wù)器啟動,載入該場景服務(wù)器中所有游戲場景的碰撞模型至顯存中,生成各個游戲場景的碰撞模型相關(guān)聯(lián)的加速結(jié)構(gòu)并復(fù)制至顯存中。優(yōu)選地,本發(fā)明中,游戲場景的碰撞模型可通過三角形網(wǎng)格表示。另外,本步驟401中,生成加速結(jié)構(gòu)的方式可與現(xiàn)有技術(shù)類似,本申請不具體限定。步驟402,將每個游戲場景的碰撞模型地址、包圍盒、以及加速結(jié)構(gòu)地址復(fù)制到GPU的常量內(nèi)存中。本步驟402中的數(shù)據(jù)使用頻繁,數(shù)量較少,可以通過緩存(Cache)加速訪問。為便于理解,圖5示出了步驟401中數(shù)據(jù)和步驟402中數(shù)據(jù)的存儲格式示意圖。
步驟403,載入預(yù)生成的查詢數(shù)據(jù),測試得到使用GPU計算射線查詢的最小查詢數(shù)量N。步驟404,循環(huán)針對各個游戲幀執(zhí)行以下步驟405至步驟407,直至場景服務(wù)器程
序退出。步驟405,在游戲幀開始時,將針對該游戲幀的所有射線查詢請求注冊到射線查詢
管理器中。步驟406,射線查詢管理器按游戲場景記錄射線查詢請求,并統(tǒng)計射線查詢請求數(shù)
量。 其中,射線查詢管理器按場景記錄射線查詢請求具體為同一游戲場景的射線查詢請求記錄在一起,不同游戲場景的射線查詢請求不記錄在一起,目的是便于以后生成線程塊數(shù)據(jù),具體見下文步驟603描述。步驟407,如果射線查詢請求數(shù)量大于N,則調(diào)度GPU異步執(zhí)行射線查詢,否則,使用CPU執(zhí)行射線查詢。優(yōu)選地,本發(fā)明中,在GPU執(zhí)行射線查詢時,CPU可繼續(xù)處理非射線查詢?nèi)蝿?wù)。其中,本發(fā)明中,GPU執(zhí)行射線查詢具體可參見圖6所示流程。參見圖6,圖6為本發(fā)明實施例提供的GPU執(zhí)行射線查詢流程圖。如圖6所示,該流程可包括以下步驟步驟601,將查詢數(shù)據(jù)從內(nèi)存復(fù)制到顯存中。本步驟601之所以將查詢數(shù)據(jù)從內(nèi)存復(fù)制到顯存,主要是因為GPU不能直接訪問內(nèi)存,但可直接訪問顯存。另外,本發(fā)明中,所述查詢數(shù)據(jù)至少包含以下分量射線原點的X坐標(biāo)、y坐標(biāo)和z坐標(biāo),以及射線方向的X坐標(biāo)、I坐標(biāo)和Z坐標(biāo)、以及射線最遠(yuǎn)距離。在圖7a中,該各個分量并非存儲在ー個數(shù)組,而是將各個分量単獨存為ー個數(shù)組,便于多處理器讀取數(shù)據(jù)時,合并訪存事務(wù),減少訪存次數(shù)。步驟602,劃分線程網(wǎng)格為線程塊。本步驟602中,可按照同一線程塊執(zhí)行同一游戲場景的射線查詢、且線程塊中的一個線程單獨執(zhí)行一個射線查詢?yōu)樵瓌t執(zhí)行劃分操作。由于每個射線查詢使用ー個單獨的線程計算,因此,如果線程塊的線程數(shù)量較多,則在某些線程等待射線查詢時,可以調(diào)度其它線程進行計算,這可以隱藏訪存延遲,不過由于執(zhí)行射線查詢時需要占用較多的資源,例如共享內(nèi)存,因此,線程塊內(nèi)最多只能使用256個線程。步驟603,生成并復(fù)制線程塊數(shù)據(jù)至顯存中。由于每個線程塊只處理ー個游戲場景的查詢,因此,可以保證這樣線程塊內(nèi)的所有線程共享線程塊數(shù)據(jù)。優(yōu)選地,所述線程塊數(shù)據(jù)具體與其中的線程執(zhí)行射線查詢的信息有關(guān),其大小可為12個int,至少包括查詢數(shù)據(jù)、游戲場景索引、查詢數(shù)據(jù)起始地址、射線查詢結(jié)果地址。圖7示出了線程塊數(shù)據(jù)與查詢數(shù)據(jù)之間的對應(yīng)關(guān)系。步驟604,啟動GPU的射線查詢。本步驟604具體可為首先調(diào)用每個線程塊的前12個線程讀取線程塊數(shù)據(jù)到共享內(nèi)存中,并調(diào)用syncthreads ()同步線程,使得線程塊內(nèi)的線程等待線程塊數(shù)據(jù)讀取完成后再繼續(xù)執(zhí)行射線查詢。其次,針對該線程塊的每ー線程,獲取該線程塊每ー線程負(fù)責(zé)執(zhí)行射線查詢的查詢數(shù)據(jù)在該線程塊內(nèi)的索引。其中,由于本發(fā)明使用ー維的線程塊,所以每個線程獲取的系統(tǒng)變量threadldx. x就是該線程負(fù)責(zé)執(zhí)行射線查詢的查詢數(shù)據(jù)在該線程塊內(nèi)的索引。如此,每個線程在讀取到共享內(nèi)存中線程塊數(shù)據(jù)的查詢數(shù)據(jù)起始地址的基礎(chǔ)上,用該索引進行偏移后得到其負(fù)責(zé)的查詢數(shù)據(jù)地址,讀取查詢數(shù)據(jù)。之后由該線程利用所述查詢數(shù)據(jù)執(zhí)行射線查詢。其中,基于圖7所示的查詢數(shù)據(jù),以及上面描述的碰撞模型通過三角形網(wǎng)格表示,則由所述線程利用查詢數(shù)據(jù)執(zhí)行射線查詢包括判斷該查詢數(shù)據(jù)對應(yīng)的射線是否與游戲場景的包圍盒相交,該游戲場景通過該查詢數(shù)據(jù)所處線程塊數(shù)據(jù)中的游戲場景索引確定,如果不相交,通過該線程將用于表示射線查詢結(jié)果為不相交的第一標(biāo)識比如False作為射線查詢結(jié)果寫入至共享內(nèi)存中;
如果相交,則,遍歷該游戲場景的加速結(jié)構(gòu),尋找該射線與該游戲場景的三角形網(wǎng)格最近的交點,如果未尋找到所述交點,則通過該線程將用于表示射線查詢結(jié)果為不相交的第一標(biāo)識比如False作為射線查詢結(jié)果寫入至共享內(nèi)存中,如果尋找到所述交點,則通過該線程將用于表示射線查詢結(jié)果為相交的第二標(biāo)識、以及所述交點與所述射線原點之間的距離作為射線查詢結(jié)果寫入共享內(nèi)存中,以便后續(xù)CPU處理射線查詢結(jié)果時可以根據(jù)該距離計算出交點。之后再次調(diào)用_syncthreads O同步線程,并在等待所有線程完成射線查詢結(jié)束且并將射線查詢結(jié)果寫入到共享內(nèi)存后,將共享內(nèi)存中的射線查詢結(jié)果寫入到全局內(nèi)存中。至此,完成本發(fā)明提供的方法描述。下面對本發(fā)明提供的場景服務(wù)器進行描述參見圖8,圖8為本發(fā)明實施例提供的場景服務(wù)器結(jié)構(gòu)圖。如圖8所示,該場景服務(wù)器包括注冊單元,用于當(dāng)每一游戲幀開始時,將針對該游戲幀的所有射線查詢請求注冊到射線查詢管理器中;統(tǒng)計單元,用于依據(jù)注冊至該射線查詢管理器的射線查詢請求數(shù)量統(tǒng)計出當(dāng)前是由CPU還是由圖像處理器GPU執(zhí)行射線查詢;CPU,用于在所述統(tǒng)計單元統(tǒng)計出是由CPU執(zhí)行射線查詢時,執(zhí)行射線查詢;GPU,用于在所述統(tǒng)計單元統(tǒng)計出是由GPU執(zhí)行射線查詢吋,異步執(zhí)行射線查詢,其中,所述CPU在GPU執(zhí)行射線查詢期間執(zhí)行非射線查詢?nèi)蝿?wù)。本發(fā)明中,所述統(tǒng)計単元通過以下步驟統(tǒng)計出當(dāng)前是由CPU還是由GPU執(zhí)行射線查詢包括統(tǒng)計出注冊至所述射線查詢管理器的射線查詢請求數(shù)量之和;如果該統(tǒng)計的射線查詢請求數(shù)量之和大于數(shù)值N,則確定由GPU執(zhí)行射線查詢,否貝IJ,確定由CPU執(zhí)行射線查詢; 其中,所述N可按照上述方法中描述的如何確定N的方式,其用于保證所述CPU執(zhí)行射線查詢的時間等于或開始大于數(shù)據(jù)傳輸時間時的最小射線查詢請求數(shù)量,所述數(shù)據(jù)傳輸時間為GPU從內(nèi)存中獲取用于執(zhí)行射線查詢的查詢數(shù)據(jù),以及將射線查詢的結(jié)果復(fù)制到內(nèi)存需要的時間。另外,本發(fā)明中,所述GPU通過以下步驟執(zhí)行射線查詢包括將查詢數(shù)據(jù)從內(nèi)存復(fù)制至顯存中;優(yōu)選地,每ー查詢數(shù)據(jù)至少包含以下分量射線原點的X坐標(biāo)、I坐標(biāo)和Z坐標(biāo),以及射線方向的X坐標(biāo)、y坐標(biāo)和Z坐標(biāo)、以及射線最遠(yuǎn)距離;將線程劃分為線程塊,生成并復(fù)制線程塊數(shù)據(jù)至顯存中;其中,每ー線程塊包含至少ー個線程、且每ー線程塊的線程處理同一個游戲場景的射線查詢,每ー線程塊數(shù)據(jù)至少包括查詢數(shù)據(jù)、游戲場景索引、查詢數(shù)據(jù) 起始地址、射 線查詢結(jié)果地址;針對每ー線程塊執(zhí)行以下操作針對該線程塊的每ー線程,獲取該線程塊每ー線程負(fù)責(zé)執(zhí)行射線查詢的查詢數(shù)據(jù)在該線程塊內(nèi)的索引;在該線程塊的線程塊數(shù)據(jù)中找到查詢數(shù)據(jù)起始地址,在該查詢數(shù)據(jù)起始地址基礎(chǔ)上偏移該獲取的索引之后得到該線程負(fù)責(zé)的查詢數(shù)據(jù)地址,從該查詢數(shù)據(jù)地址上讀取對應(yīng)的查詢數(shù)據(jù);由該線程利用所述查詢數(shù)據(jù)執(zhí)行射線查詢。如圖8所示,所述場景服務(wù)器進一歩包括復(fù)制單元,用于在所述場景服務(wù)器啟動時,生成各個游戲場景的碰撞模型相關(guān)聯(lián)的加速結(jié)構(gòu),將該加速結(jié)構(gòu)以及各個游戲場景的碰撞模型復(fù)制至顯存中,以及將各個游戲場景的包圍盒、加速結(jié)構(gòu)地址、以及碰撞模型地址復(fù)制至GPU的常量內(nèi)存中,其中,所述游戲場景的碰撞模型通過三角形網(wǎng)格表示;基于此,所述線程利用查詢數(shù)據(jù)執(zhí)行射線查詢包括判斷該查詢數(shù)據(jù)對應(yīng)的射線是否與游戲場景的包圍盒相交,該游戲場景通過該查詢數(shù)據(jù)所處線程塊數(shù)據(jù)中的游戲場景索引確定,如果不相交,通過該線程寫入用于表示射線查詢結(jié)果為不相交的第一標(biāo)識至共享內(nèi)存中;如果相交,則,遍歷該游戲場景的加速結(jié)構(gòu),尋找該射線與該游戲場景的三角形網(wǎng)格最近的交點,如果未尋找到所述交點,則通過該線程寫入用于表示射線查詢結(jié)果為不相交的第一標(biāo)識至共享內(nèi)存中,如果尋找到所述交點,則通過該線程寫入用于表示射線查詢結(jié)果為相交的第二標(biāo)識至共享內(nèi)存中,并將所述交點與所述射線原點之間的距離寫入共享內(nèi)存中。至此,完成本發(fā)明提供的場景服務(wù)器結(jié)構(gòu)描述。下面通過ー個測試舉例說明本發(fā)明達(dá)到的效果使用硬件配置為Intel Core i5_2300CPU、4G內(nèi)存、GTX460顯卡的場景服務(wù)器,載入10個場景近100萬個三角形網(wǎng)格,對ー組典型的射線查詢數(shù)據(jù)進行測試,測試結(jié)果如下表I所示。
權(quán)利要求
1.一種網(wǎng)絡(luò)游戲中的射線查詢方法,其特征在于,該方法包括 場景服務(wù)器針對每一游戲幀執(zhí)行以下操作 在每一游戲幀開始時,將針對該游戲幀的所有射線查詢請求注冊到射線查詢管理器中; 依據(jù)注冊至該射線查詢管理器的射線查詢請求數(shù)量統(tǒng)計出當(dāng)前是由CPU還是由圖像處理器GPU執(zhí)行射線查詢; 如果統(tǒng)計出是由CPU執(zhí)行射線查詢,則由CPU執(zhí)行射線查詢; 如果統(tǒng)計出是由GPU執(zhí)行射線查詢,則調(diào)度GPU異步執(zhí)行射線查詢,而CPU在GPU執(zhí)行射線查詢期間執(zhí)行非射線查詢?nèi)蝿?wù)。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于,依據(jù)注冊至射線查詢管理器的射線查詢請求數(shù)量統(tǒng)計出當(dāng)前是由CPU還是由GPU執(zhí)行射線查詢包括 統(tǒng)計出注冊至所述射線查詢管理器的射線查詢請求數(shù)量之和; 如果該統(tǒng)計的射線查詢請求數(shù)量之和大于數(shù)值N,則確定由GPU執(zhí)行射線查詢,否則,確定由CPU執(zhí)行射線查詢; 其中,所述N用于保證所述CPU執(zhí)行射線查詢的時間等于或開始大于數(shù)據(jù)傳輸時間時的最小射線查詢請求數(shù)量,所述數(shù)據(jù)傳輸時間為GPU從內(nèi)存中獲取用于執(zhí)行射線查詢的查詢數(shù)據(jù),以及將射線查詢的結(jié)果復(fù)制到內(nèi)存需要的時間。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述N通過以下步驟確定 所述場景服務(wù)器在啟動時載入預(yù)先生成的查詢數(shù)據(jù); 所述場景服務(wù)器使用該生成的查詢數(shù)據(jù)測試CPU執(zhí)行射線查詢的時間和所述數(shù)據(jù)查詢時間,當(dāng)測試結(jié)果為(PU執(zhí)行射線查詢時間等于或開始大于所述數(shù)據(jù)傳輸時間時,確定當(dāng)前已使用的查詢數(shù)據(jù)的數(shù)量為所述N。
4.根據(jù)權(quán)利要求I至3任一所述的方法,其特征在于,所述GPU執(zhí)行射線查詢包括 將查詢數(shù)據(jù)從內(nèi)存復(fù)制至顯存中; 將線程劃分為線程塊,生成并復(fù)制線程塊數(shù)據(jù)至顯存中;其中,每一線程塊包含至少一個線程、且每一線程塊的線程處理同一個游戲場景的射線查詢,每一線程塊數(shù)據(jù)至少包括查詢數(shù)據(jù)、游戲場景索引、查詢數(shù)據(jù)起始地址、射線查詢結(jié)果地址; 針對每一線程塊執(zhí)行以下操作 針對該線程塊的每一線程, 獲取該線程塊每一線程負(fù)責(zé)執(zhí)行射線查詢的查詢數(shù)據(jù)在該線程塊內(nèi)的索引; 在該線程塊的線程塊數(shù)據(jù)中找到查詢數(shù)據(jù)起始地址,在該查詢數(shù)據(jù)起始地址基礎(chǔ)上偏移該獲取的索引之后得到該線程負(fù)責(zé)的查詢數(shù)據(jù)地址,從該查詢數(shù)據(jù)地址上讀取對應(yīng)的查詢數(shù)據(jù); 由該線程利用所述查詢數(shù)據(jù)執(zhí)行射線查詢。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,在所述方法執(zhí)行之前,進一步包括場景服務(wù)器在啟動時,生成各個游戲場景的碰撞模型相關(guān)聯(lián)的加速結(jié)構(gòu),將該加速結(jié)構(gòu)以及各個游戲場景的碰撞模型復(fù)制至顯存中,以及將各個游戲場景的包圍盒、加速結(jié)構(gòu)地址、以及碰撞模型地址復(fù)制至GPU的常量內(nèi)存中。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述查詢數(shù)據(jù)至少包含以下分量射線原點的X坐標(biāo)、y坐標(biāo)和z坐標(biāo),以及射線方向的X坐標(biāo)、y坐標(biāo)和z坐標(biāo)、以及射線最遠(yuǎn)距離; 所述游戲場景的碰撞模型通過三角形網(wǎng)格表示; 所述線程利用查詢數(shù)據(jù)執(zhí)行射線查詢包括 判斷該查詢數(shù)據(jù)對應(yīng)的射線是否與游戲場景的包圍盒相交,該游戲場景通過該查詢數(shù)據(jù)所處線程塊數(shù)據(jù)中的游戲場景索引確定,如果不相交,通過該線程寫入用于表示射線查詢結(jié)果為不相交的第一標(biāo)識至共享內(nèi)存中; 如果相交,則, 遍歷該游戲場景的加速結(jié)構(gòu),尋找該射線與該游戲場景的三角形網(wǎng)格最近的交點,如果未尋找到所述交點,則通過該線程寫入用于表示射線查詢結(jié)果為不相交的第一標(biāo)識至共享內(nèi)存中, 如果尋找到所述交點,則通過該線程寫入用于表示射線查詢結(jié)果為相交的第二標(biāo)識至共享內(nèi)存中,并將所述交點與所述射線原點之間的距離寫入共享內(nèi)存中。
7.一種應(yīng)用于網(wǎng)絡(luò)游戲中射線查詢的場景服務(wù)器,其特征在于,該場景服務(wù)器包括 注冊單元,用于當(dāng)每一游戲幀開始時,將針對該游戲幀的所有射線查詢請求注冊到射線查詢管理器中; 統(tǒng)計單元,用于依據(jù)注冊至該射線查詢管理器的射線查詢請求數(shù)量統(tǒng)計出當(dāng)前是由CPU還是由圖像處理器GPU執(zhí)行射線查詢; CPU,用于在所述統(tǒng)計單元統(tǒng)計出是由CPU執(zhí)行射線查詢時,執(zhí)行射線查詢; GPU,用于在所述統(tǒng)計單元統(tǒng)計出是由GPU執(zhí)行射線查詢時,異步執(zhí)行射線查詢,其中,所述CPU在GPU執(zhí)行射線查詢期間執(zhí)行非射線查詢?nèi)蝿?wù)。
8.根據(jù)權(quán)利要求7所述的場景服務(wù)器,其特征在于,所述統(tǒng)計單元通過以下步驟統(tǒng)計出當(dāng)前是由CPU還是由GPU執(zhí)行射線查詢包括 統(tǒng)計出注冊至所述射線查詢管理器的射線查詢請求數(shù)量之和; 如果該統(tǒng)計的射線查詢請求數(shù)量之和大于數(shù)值N,則確定由GPU執(zhí)行射線查詢,否則,確定由CPU執(zhí)行射線查詢; 其中,所述N用于保證所述CPU執(zhí)行射線查詢的時間等于或開始大于數(shù)據(jù)傳輸時間時的最小射線查詢請求數(shù)量,所述數(shù)據(jù)傳輸時間為GPU從內(nèi)存中獲取用于執(zhí)行射線查詢的查詢數(shù)據(jù),以及將射線查詢的結(jié)果復(fù)制到內(nèi)存需要的時間。
9.根據(jù)權(quán)利要求7或8所述的場景服務(wù)器,其特征在于,所述GPU通過以下步驟執(zhí)行射線查詢包括 將查詢數(shù)據(jù)從內(nèi)存復(fù)制至顯存中; 將線程劃分為線程塊,生成并復(fù)制線程塊數(shù)據(jù)至顯存中;其中,每一線程塊包含至少一個線程、且每一線程塊的線程處理同一個游戲場景的射線查詢,每一線程塊數(shù)據(jù)至少包括查詢數(shù)據(jù)、游戲場景索引、查詢數(shù)據(jù)起始地址、射線查詢結(jié)果地址; 針對每一線程塊執(zhí)行以下操作 針對該線程塊的每一線程, 獲取該線程塊每一線程負(fù)責(zé)執(zhí)行射線查詢的查詢數(shù)據(jù)在該線程塊內(nèi)的索引; 在該線程塊的線程塊數(shù)據(jù)中找到查詢數(shù)據(jù)起始地址,在該查詢數(shù)據(jù)起始地址基礎(chǔ)上偏移該獲取的索引之后得到該線程負(fù)責(zé)的查詢數(shù)據(jù)地址,從該查詢數(shù)據(jù)地址上讀取對應(yīng)的查詢數(shù)據(jù); 由該線程利用所述查詢數(shù)據(jù)執(zhí)行射線查詢。
10.根據(jù)權(quán)利要求9所述的場景服務(wù)器,其特征在于,所述查詢數(shù)據(jù)至少包含以下分量射線原點的X坐標(biāo)、y坐標(biāo)和z坐標(biāo),以及射線方向的X坐標(biāo)、y坐標(biāo)和z坐標(biāo)、以及射線最遠(yuǎn)距離; 所述場景服務(wù)器進一步包括 復(fù)制單元,用于在所述場景服務(wù)器啟動時,生成各個游戲場景的碰撞模型相關(guān)聯(lián)的加速結(jié)構(gòu),將該加速結(jié)構(gòu)以及各個游戲場景的碰撞模型復(fù)制至顯存中,以及將各個游戲場景的包圍盒、加速結(jié)構(gòu)地址、以及碰撞模型地址復(fù)制至GPU的常量內(nèi)存中,其中,所述游戲場景的碰撞模型通過三角形網(wǎng)格表示; 所述線程利用查詢數(shù)據(jù)執(zhí)行射線查詢包括 判斷該查詢數(shù)據(jù)對應(yīng)的射線是否與游戲場景的包圍盒相交,該游戲場景通過該查詢數(shù)據(jù)所處線程塊數(shù)據(jù)中的游戲場景索引確定,如果不相交,通過該線程寫入用于表示射線查詢結(jié)果為不相交的第一標(biāo)識至共享內(nèi)存中; 如果相交,則, 遍歷該游戲場景的加速結(jié)構(gòu),尋找該射線與該游戲場景的三角形網(wǎng)格最近的交點,如果未尋找到所述交點,則通過該線程寫入用于表示射線查詢結(jié)果為不相交的第一標(biāo)識至共享內(nèi)存中, 如果尋找到所述交點,則通過該線程寫入用于表示射線查詢結(jié)果為相交的第二標(biāo)識至共享內(nèi)存中,并將所述交點與所述射線原點之間的距離寫入共享內(nèi)存中。
全文摘要
本發(fā)明提供了網(wǎng)絡(luò)游戲中的射線查詢方法和場景服務(wù)器。該方法包括場景服務(wù)器針對每一游戲幀執(zhí)行以下操作在每一游戲幀開始時,將針對該游戲幀的所有射線查詢請求注冊到射線查詢管理器中;依據(jù)注冊至該射線查詢管理器的射線查詢請求數(shù)量統(tǒng)計出當(dāng)前是由CPU還是由圖像處理器GPU執(zhí)行射線查詢;如果統(tǒng)計出是由CPU執(zhí)行射線查詢,則由CPU執(zhí)行射線查詢;如果統(tǒng)計出是由GPU執(zhí)行射線查詢,則調(diào)度GPU異步執(zhí)行射線查詢,而CPU在GPU執(zhí)行射線查詢期間執(zhí)行非射線查詢?nèi)蝿?wù)。
文檔編號G06F19/00GK102810133SQ20121015040
公開日2012年12月5日 申請日期2012年5月15日 優(yōu)先權(quán)日2012年5月15日
發(fā)明者李利國 申請人:北京像素軟件科技股份有限公司