2011-06-05 35 views
5

想象一下,多人白板可以同時吸引多人蔘與。爲了簡單起見,可以說白板上有一個可以被任何用戶移動或刪除的對象。沒有用戶擁有的對象的概念(即任何用戶被允許操縱任何對象是重要的...這是一個免費的所有白板)多人白板競賽條件

我的問題是這個......如果兩個用戶試圖在同一時間對對象做不同的動作,即一個刪除它,另一個移動它,會發生什麼?

中只是讓消息正確NOW-經過,它就會完全不正常的。

一個想法是有它解決了誰擁有對象的控制,並沒有被允許,直到衝突解決發生的客戶方一個服務器端控制。衝突的解決可以基於先到先得的原則。

即使這種情況發生得非常快,小延時(〜50-300ms)是不可接受的,因爲運動必須在客戶端瞬間。例如,不要操縱對象,而是想象一支筆。因爲這會拖延到他們已經開始繪畫......不太好!

另一個想法是有一個「請求控制」按鈕,這如之前詢問控制服務器側延伸....同樣的想法,但現在它們不是由筆繪圖的初始延遲受挫。這也是不太好,雖然,因爲他們必須打的按鈕,直到他們可以做任何事情,而這個白板的真正含義爲孩子們......

任何其他解決辦法? :)

回答

3

這是一個有趣的問題,通常通過客戶端和服務器端解決方案的組合解決。如果你熟悉魔獸世界,特別是最初的發佈日期,你會記得服務器崩潰,每個人都在繼續移動。這由客戶端管理謂詞運動完成,並請求服務器定期更新實際位置和行爲值。

類似的想法應該適用於您的問題。您在f.c.f.s的基礎上的服務器端分辨率看起來很理想。您提到的問題是延遲降低了用戶體驗。要做到這一點,爲什麼不給用戶完整的客戶端控制,然後在操作之後請求從服務器進行更新?因此,如果將圓圈向下移動200px,並將顏色更改爲綠色,我們都可以看到即時客戶端行爲,但是當您釋放該圓圈時,您也會看到它變爲綠色,正如通過服務器告知的那樣。

最明顯的問題這個時候兩個用戶更改對象相同的屬性越高。在這一點上,f.c.f.s系統需要根據客戶的使用情況做出決定。它應該在對象上執行淨增量嗎?你是否應該通知用戶其他用戶以不同的方式更改了對象?這是一個比技術問題更多的特徵問題。

+0

我喜歡你如何指出衝突只存在於特定的財產變化!即顏色和位置不是衝突,但位置和位置或位置和刪除是...... – davidkomer 2011-06-05 09:44:51

+0

我猜只是最簡單的級別,如果服務器給出對象的消息,我可以保持歷史並「跳回並禁止控制」 -locked ...... – davidkomer 2011-06-05 09:46:17

+0

一個簡單的解決衝突的類似屬性操作將時間戳的用戶交互和維護最新的變化(或者如果對象被刪除只是不停地刪除) – dain 2011-06-05 13:57:42

0

真的很有趣的問題!白板的狀態存儲在服務器上(例如在數據庫中)。客戶端有三種可能的操作:startEditing,finishEditingdelete。在執行一些操作之後,您應該向服務器發送消息來描述操作。

如果發送startEditing,首先應檢查您要編輯的對象是否沒有鎖定。如果它被解鎖,你應該放置鎖(鎖應該包含關於放置鎖的用戶的信息)。然後,您應該向所有活動客戶端發送消息,告訴該對象不應該被編輯。

如果finishEditing(這個應該包含關於對象變化的信息)被髮送,你應該改變數據庫中的對象釋放鎖定併發送消息給所有活動客戶端,告訴更改並釋放鎖定。

如果delete發送。如果對象不是由客戶端從一個它發送的消息不同的鎖,你應該從數據庫中刪除對象,併發送消息給所有活動的客戶端責令刪除白板

+0

的問題是,當發送startEditing,「檢驗」要求一個檢查serverside,引入延遲 – davidkomer 2011-06-05 10:06:59

+0

如果第一個客戶端在與第二個同時發送'startEditing',一些客戶端將第一個放置鎖,第二個將看到鎖,並且什麼都不做 – Eugeny89 2011-06-05 10:28:33

+0

是的,但是再次 - 問題是如果客戶有鎖,客戶端必須立即繪製。 – davidkomer 2011-06-05 12:44:59

0

該對象您可能能夠做一些事情,其中您將展示本地物品互動以及其他人看到的內容。在開始時你會展示一些類似的東西,你正在與之交互或寫作的透明對象不是最終的,每個人都看到不透明的對象/圖畫是最終的,以及所看到的。

當您檢測到2個用戶同時移動一個物品時,在他們自己的屏幕上它們都是透明的,在一些多人遊戲更新的過程中,已確定控制的用戶仍在移動物體,而您可以顯示正在移動其物體的用戶的某種事件(也許是普通噗噗聲),現在已經被確定爲不受他們控制。

這樣,當確定他們不會成爲一個在項目的控制,你得到即時響應繪圖和有點沮喪,不時。

+0

如果我正確地理解了您,它與我上面所說的一樣 - 「我猜只是最簡單的級別,我可以保持一個歷史和「跳回並禁止控制」,如果服務器對鎖定的對象的消息......「 ,但你已經添加在客戶端的視覺線索,使他們能夠有一個對象區分實際上是對可能是臨時嘗試的舉動...?是對的嗎?我喜歡! – davidkomer 2011-06-09 06:08:20