2007年,“SecondLife”三維虛擬風暴席卷了現實世界。原本定位為人生模擬類在線游戲的SecondLife,現在已經逐步演變成為一個國際化的在線模擬社區。人們在其中進行虛擬房地產交易,藝術家開辦自己的作品展覽,作為世界5大會計事務所之一的畢馬威展開招聘工作,BBC等老牌傳統媒體配備了SecondLife特派專職記者,時尚巨頭阿瑪尼也開了專賣店。現實世界中的一切,都可以在SecondLife中找到對應之物。不難想象,能夠產生如此巨大影響力的SecondLife,其龐大的虛擬世界背后必然有優秀的技術架構作為支持。接下來就讓我們一起來看看其中端倪。
SecondLife服務器構成
SecondLife(下簡稱SL)的服務器端包括這六大類服務器:Login server(登陸服務器);User server(用戶服務器);Space
server(空間服務器);Data server(即數據服務器);Simulator(即模擬器),常被稱為SIM;Other
servers(其他服務器),包含若干不同功能服務器,林登公司(Linden)似乎對它們的詳情有所保留。
下面對這六大類服務器進行詳細解釋。
1、Login
server,登錄服務器。是運行在login.agni.lindenlab.com上的CGI腳本。顧名思義,就是用來驗證用戶名和密碼的。驗證后還要決定用戶登錄到什么區域:是用戶的家、還是上次離開SL時的區域或者URL指定的某個區域。接下來要找到運行該區域的模擬器,驗證用戶是否被允許連接到該區域。最后向模擬器發出連接請求,并告知客戶端連接到何處。
2、User server,用戶服務器。曾被用來處理用戶登錄,即登錄服務器現在的功能?,F在負責管理即時通訊(instant
message)會話,尤其是組內即時通訊。
3、Space
server,空間服務器。處理基于不同網格X,Y坐標間消息的路徑選擇。模擬器與空間服務器會話以便被其登記在案,還可以發現自己的鄰居是誰。作用與網絡概念中路由器相仿。
4、Data
server,數據服務器。處理與中心數據庫、日志服務器、倉庫數據庫以及搜索數據庫的連接(上述4種服務器屬于第6類其他服務器),代表模擬器運行查詢。(注: SL
服務器網格中只有一個中心服務器,日志服務器,而倉庫服務器以及搜索服務器分別有多個,或者在某個范圍內,前兩者與后兩者分別是一對多的關系。)
5、Simulator,模擬器。這是SL最主要的服務器。每個模擬器模擬一個256*256平米的整塊區域。當SL客戶端瀏覽器滿虛擬世界轉悠時,實際上是在不同的模擬器間被倒手。模擬器的任務有:存儲物體狀態、土地狀態、地形海拔圖狀態。模擬器還負責計算物體和土地的能見度,并把計算數據傳送給客戶端。模擬器還使用優先級隊列傳送圖像數據。還有一種物理學模擬器專門掌管Hovak物理學例庫[1]。公共談話(Chat)和即時通訊(instant
message)也由模擬器處理。全速運行時,模擬器可達每秒45幀,如果不能保持全速,它將在不減低幀速率的情況下嘗試時間膨脹[2],在Second
Life中如果不能全速,則會以物體顯示延遲為代價,而不會影響已顯示物品的質量,這種效果也被叫做Lag。
模擬器兩兩之間以UDP網絡連接進行通信,并由相鄰的模擬器保持通信連接。
要注意的是:在Second
Life中,模擬器與客戶端瀏覽器(Viewer)之間的區別與其他虛擬環境差異較大。模擬器負責運行物理引擎,碰撞檢測,跟蹤每一事物和用戶化身Avitar的位置,將物品的位置發送給客戶端,必要時將更新的數據發送給客戶端(只有當發生碰撞或者方向和速度變化等情況下才會有這種更新)。而客戶端負責處理本地物品的位置,獲取速度等物理學信息,進行簡單的物理學運算以跟蹤何物向何處移動,不進行碰撞檢測。
6、Other servers,其他服務器,其中包含若干規模較小的服務器。下面一一說明:
l 中央樞紐:在SL的官方網站上沒有給出說明,但根據字面意思推斷,應當與全局通訊、調度以及分布式運算有關。
l
代理數據庫:掌管元數據與項目id(UUID)之間的映射。代理(Agent)一詞在SL中特指與用戶化身(Avatar)相對應的后臺底層的唯一表示,在SL計算機系統中有唯一識別號,簡稱UUID,該號碼與用戶是唯一對應且持久存在的。其他物品也有UUID,但物品的UUID是在物品放置于虛擬世界中時臨時生成的,不是持久的UUID。元數據是指在Second
Life中不可分的數據,比如構成物體形狀的基本單元(prim),或者一張紋理(texture)。一個物體可能由多個元數據組成,因此需要記錄元數據與物體,也即是此處所稱的項目之間的關系,而代理數據庫就承擔此責任。同時,任何物體都有唯一擁有者,記錄物體的擁有者,也是代理數據庫的任務。
l
中心數據庫:官方文檔描述該服務器存儲誰擁有什么,用于記錄賬單,而實際上遠不止這么簡單,但囿于目前所能取得的資料,很少有對其詳細的敘述。
l
搜索數據庫:中心數據庫的副本,用于搜索??梢詳喽ǎ瑸榱颂岣咚阉餍?,此數據庫一定保有大量索引。而中心數據庫為了保證數據寫入和修改的效率,使用的索引肯定是比較少的。
l 地圖服務器:使用OpenGL繪制全局地圖。Second
Life客戶端也是使用OpenGL繪制的,此外普通網頁上的SL地圖使用的是Google的地圖API。
l RPC服務器: XML RPC(遠程過程調用)服務器。其作用包含:開發者需要的,不通過客戶端瀏覽器來操作Second
Life的API,可將XMLRPC服務器代碼翻譯為in-world請求,與空間數據庫和中心數據庫通訊。
SecondLife用戶登錄驗證步驟解析
我們不妨通過分析登錄驗證的步驟,來看看這些服務器是如何進行互相通信的。流程可參見文后圖示。
1. 客戶端對用戶服務器發出安全信息校驗和(Checnsum)請求,端口號:12036。
2. 客戶端對登錄服務器發出登錄請求:
a) 通過HTTP打包發送XML RPC進行登錄;
b) Web服務器(多數情況下是Apache)與SQL數據庫通話,獲得用戶信息,連接模擬器所需信息(比如IP地址)并生成連接;
c) 用戶帳號名稱,MD5口令,客戶端版本,登錄地址請求。
3. 登錄服務器從數據庫獲得授權證書。
4. 登錄服務器與網格中的模擬器對話:
a) 決定哪個模擬器負責該客戶端;
b) 請求會話開始;
c) 網格返回與客戶端通訊的UDP端口號 12035,13000-13050
5. SIM響應登錄服務器,告知用戶是否允許登錄到模擬器。
6. 登錄服務器響應客戶端:
a) 返回的信息有,用戶id,會話id,安全會話id,模擬器IP,模擬器端口號,全局坐標,用戶倉庫信息等;
b) 大部分id都是UUID(比如用戶id,會話id,安全會話id);
c) 用戶id是唯一的,并且是永久的。
7. 客戶端與模擬器握手,并發送用戶id和會話id。
8. 客戶端與用戶服務器握手:
a) 發送出席信息,以便收到組及時消息(Group IM);
b) 給用戶授予組權限;
c) 用戶服務器驗證模擬器會話信息(在數據庫的Presence-Agent表中)。
結語
以上是對SecondLife架構的一個簡要介紹,目前國內已經出現了類似SecondLife的在線虛擬游戲/社區,希望本文能夠為大家提供一些啟示,同時也期待國內的架構師們出來分享自己的經驗與心得。
說明:本文部分內容譯自SecondLife官方wiki。
--------------------------------------------------------------------------------
[1]簡單地說物理學模擬器負責物理學相關的運算,比如重力加速度的效果,不同物體的空間占位關系等。Hovak是服務器端系統(grid)的代號,即將發布的是Hovak4。
[2]物理學名詞,來自相對論。時間并不是永遠以我們感受到的當前這種速度進行的,它也會發生變化;一般和速度有關。速度越快,越接近于光速,時間就會越慢