1. 程式人生 > >SmartFoxServer 2X區和房間建築

SmartFoxServer 2X區和房間建築

»區和房間建築

SmartFoxServer 2X針對SmartFoxServer 1.x引入了區域和房間配置方式的重大改進。 特別是我們建立了一個新的簡單概念,稱為房間組,允許將房間組織成邏輯組,彼此分離。 使用者將能夠訂閱他們感興趣的群組中發生的事件,忽略所有其他群組。

這種方法的主要優點是由伺服器傳送的初始房間列表將更小,並且向每個客戶端發起的事件的數量被大大減少,特別是在高流量應用的情況下。

一個例子將闡明這個概念:這裡寫圖片描述
使用者最初可以預訂大廳組並且僅接收該組下的房間的房間更新(例如新建立或移除的房間,使用者計數更改和房間變數更新)。
如果使用者對玩遊戲感興趣,他可以訂閱其他遊戲組之一,看看哪些遊戲可用並加入他們。使用者還可以隨時取消訂閱任何組。使用者甚至可以避免訂閱任何組,並仍然能夠加入區域中的任何房間,雖然他不會收到未加入的房間的任何更新。

新的方法,結合區域和房間配置(更多在後面)的更細粒度水平,允許應用程式設計師建立高度複雜的系統與多個遊說,遊戲,個人空間,私人區域等。新功能還提供了更合理和有組織的方式來管理區域中的數千個房間,同時將客戶端更新的數量保持在最低限度。

以下列表描述了幾種不同的可能情況。

使用者加入區域而不訂閱任何會議室組:在這種情況下,使用者將收到一個空的會議室列表,伺服器不會更新任何會議室事件。這是一個很好的設定,當你想讓使用者與您的伺服器端擴充套件,而不必接收不必要的房間更新。典型的用例是使用者登錄檔,諮詢使用者搜尋功能或其他使用者簡檔相關活動,其中不需要與其他客戶端的互動。

使用者加入區域並訂閱一個初始房間組:這可能是最常見的用例,並且非常類似於SmartFoxServer 1.x。這裡的區別是,房間列表將僅包含所選組中的房間,並將過濾掉所有其他房間。預設情況下,客戶端將更新有關新建立或刪除的房間。開發人員還將能夠配置其他事件,如使用者計數更新,房間變數更新等。

使用者加入區域並訂閱多個房間組:訂閱多個組允許更復雜的房間過濾。玩家將能夠獲得由所選組中的房間組成的自定義房間列表。通常,客戶端將加入大廳組,可能是具有特定主題的聊天組,以及可以尋找遊戲來玩遊戲的遊戲組。

最後組可以在執行時建立,並動態訂閱/取消訂閱。
»細粒度區域和房間活動

使用SmartFoxServer 2X,您可以更好地控制每個區域和房間發生的事件。
這是管理工具中Room配置的一個示例:
這裡寫圖片描述
上述介面顯示了在建立新房間時如何微調每個Room級別活動和許可權。根據上述配置,使用者將能夠更改房間的名稱和密碼,而調整大小(容量更改)將被拒絕。房間內還允許公共資訊,所有可用的活動將被通知。
在另一個房間中,您可能需要不同地配置這些設定,抑制一些事件並提供一組不同的許可權。

客房定義兩類設定:許可權和事件。

許可權指示在執行時可以執行哪些與房間相關的操作。

ROOM_NAME_CHANGE:確定是否可以在執行時更改房間名稱
PASSWORD_STATE_CHANGE:確定在執行時是否可以更改/刪除Room密碼
PUBLIC_MESSAGES:確定房間是否支援公共訊息
CAPACITY_CHANGE:確定是否可以在執行時修改房間容量

事件指示房間將通知加入的客戶的事件。

USER_ENTER_EVENT:確定在使用者加入會議室時是否應傳送更新
USER_EXIT_EVENT:確定在使用者離開會議室時是否應傳送更新
USER_COUNT_CHANGE_EVENT:確定每當Room內的使用者數量發生變化時是否應觸發事件
USER_VARIABLES_UPDATE_EVENT:確定在使用者設定其使用者變數時是否應傳送更新

最後,客房有一種新的方式來定義他們的移除模式,這表示是否和何時應該自動移除房間。以下設定可用。

預設值:房間根據SmartFoxServer 1.x中已存在的預設規則刪除:常規房間在空時刪除,建立者離線,遊戲室將在空時刪除
When_Empty:當房間為空時,房間被刪除
When_Empty_And_Creator_Is_Gone:當空房間及其建立者離線時,房間將被刪除
Never_Remove:房間永遠不會自動刪除

»使用者計數更新

SmartFoxServer中最大的頻寬佔用更新是使用者計數更新事件,每次在任何Room內的使用者數量發生變化時,所有使用者都會觸發該事件。在交通繁忙的情況下,這個事件可能每秒被觸發幾十次,導致顯著的頻寬消耗和丟棄訊息問題。

SmartFoxServer 2X引入了幾個引擎級優化,在很大程度上減少了使用者計數更新的影響。

分組優先順序:SmartFoxServer 2X引擎(代號為Bitswarm)允許為每個分組指定優先順序,允許低優先順序響應(如使用者計數更新)在客戶端佇列過於繁忙時被丟棄。當客戶端使用緩慢的連線時,這顯著減少了丟棄訊息的問題。

使用者計數更新限制:為了進一步提高對此事件的控制級別,SmartFoxServer 2X可以配置為通過聚合訊息並僅傳送重要訊息來“減慢”傳送這些更新的速度。換句話說,你可以指定一個特定的時間間隔,在該時間間隔之後應該觸發事件。兩個時間間隔之間的所有更新將被捨棄丟棄的時間。

為了更好地瞭解節流系統的工作原理,讓我們假設我們將間隔設定為2000毫秒。這是在兩個間隔之間發生:

大堂客房(10/20)
大堂客房(11/20)
大堂客房(12/20)
HipHop聊天(33/35)
HipHop聊天(32/35)
HipHop聊天(31/35)

這是真正傳送作為更新在下一個間隔:

大堂客房(12/20)
HipHop聊天(31/35)

僅傳輸最新的最新使用者計數,並且所有剩餘的使用者計數被過濾掉。
»房間變數和使用者變數
SmartFoxServer 2X在房間/使用者變數方面引入了顯著改進,在客戶端和伺服器端增加了更多的靈活性。
最需要的增強之一是支援巢狀物件,我們已經添加了。現在完全支援陣列和字典。我們還添加了以下兩個新設定。

隱藏:當房間/使用者變數被隱藏時,它將永遠不會被髮送到客戶端。這允許決定哪些變數僅在伺服器端,哪些變數與客戶端保持同步。新功能消除了將自定義資料附加到Room / User物件的兩種不同方法的需要。以前在SmartFoxServer 1.x中,您有房間/使用者變數和房間/使用者屬性。使用SmartFoxServer 2X,所有自定義資料都通過房間/使用者變數進行處理。

全域性:此標誌僅適用於Room Variables。全域性房間變數在區域級別更新,換句話說,在房間外部。這意味著設定為全域性的房間變數將在同一房間組中的所有客戶端上更新。這是另一個期待已久的功能,已被問過很多次。
這是一個如何在擴充套件中設定房間變數的快速示例:
private void setSomeVariables(Room room, User owner)
{
    List<RoomVariable> listOfVars = new ArrayList<RoomVariable>();
    listOfVars.add( new SFSRoomVariable("bgImage", "coolBackground.jpg") );
    listOfVars.add( new SFSRoomVariable("stars", 4) );

    RoomVariable hiddenVar = new SFSRoomVariable("isPremiumUsersOnly", true);
    hiddenVar.setHidden(true);
    listOfVars.add(hiddenVar);

    // Set variables
    sfsApi.setRoomVariables(owner, room, listOfVars)
}

正如你可以看到,稱為hiddenVar的房間變數被標記為隱藏,它不會傳輸到客戶端。 伺服器端程式碼將能夠檢查它,並檢視房間是否僅為高階使用者。

在客戶端(ActionScript 3),設定變數同樣很簡單:

private function setSomeVariables(room:Room):void
{
    var listOfVars:Array = new Array()

    listOfVars.push( new SFSRoomVariable("bgImage", "coolBackground.jpg") )
    listOfVars.push( new SFSRoomVariable("stars", 4) )

    // nested object
    var chatSettings:SFSObject = new SFSObject()
    chatSettings.putUtfStringArray("allowedFonts", ["Verdana", "Arial", "Times New Roman"])
    chatSettings.putIntArray("allowedFontSizes", [10,11,12,13])
    chatSettings.putBool("isBoldAllowed", true)
    chatSettings.putBool("isItalicAllowed", true)
    chatSettings.putBool("isUnderlineAllowed", false)

    listOfVars.push( new SFSRoomVariable("settings", chatSettings))

    // Set variables
    sfs.send( new SetRoomVariablesRequest(listOfVars, room) )
}