我們可以想象查排,在單一世界架構中凳枝,肯定需要大量的服務器來支持,但反映在虛擬世界中跋核,時間的流動是唯一的岖瑰。全部服務器的時間流動就是整個世界的時間之軸叛买,也就是時間之軸的流動是整個世界的標準時間。
在實現(xiàn)中蹋订,單一世界顯然是由很多服務器構成了聪全,每個服務器之間必然存在時間差,這種時間差可能導致基于時間相關的行為發(fā)生混亂辅辩。比如P1/P2兩個玩家互 相攻擊难礼,P1在T1時間作出攻擊行為,P2在T2時間作出攻擊行為玫锋,本來P1先擊中P2蛾茉,并殺死P2,但由于時間差的緣故撩鹿,T2反而小于T1谦炬,導致 P2的攻擊行為先于P1發(fā)生,最后节沦,反而是P2先擊殺了P1键思。如果統(tǒng)一由時間之軸作為基準的話,這種情況就不會發(fā)生甫贯。時間之軸規(guī)范世界所有事件的發(fā)生順 序吼鳞,所以他的重要性不用贅述。
但是叫搁,在實際中赔桌,卻沒有那么嚴格。我們可以想象渴逻,影月谷和荊棘谷之間的時間順序并沒有什么關系疾党,他們之間的時間粒度完全可以在比較粗的粒度上保持一致。而 靠的比較近的暴風城和閃金鎮(zhèn)的世界時間誤差的精度要求就高點了惨奕。對精度要求最高的只有2個事情雪位,1、發(fā)生關聯(lián)的時候梨撞,時間的順序關系才有作用雹洗;2、靠近分 區(qū)邊界的實體聋袋,這兩個比較好理解队伟。發(fā)生關聯(lián)的兩個實體,關聯(lián)的發(fā)生順序對他們存在影響幽勒,如上面所描述的戰(zhàn)斗場景嗜侮。而靠近分區(qū)邊界的實體就容易發(fā)生關聯(lián)。如 果在一個分區(qū)內部的2個實體,他們得到的都是一個服務器的時間锈颗,所以不會存在時間誤差顷霹。
我們考慮一個最高精度的情況,就像上面兩個玩家在分區(qū)邊界發(fā)生的攻擊行為击吱。這時世界時間為T毫秒淋淀,A區(qū)為TA毫秒,B區(qū)為TB毫秒覆醇,網(wǎng)絡傳輸延時為D毫 秒朵纷。我們假設P1/P2作出攻擊行為的時間間隔很短,只有1毫秒左右永脓,我們現(xiàn)在擔心的是袍辞,會因為不同區(qū)之間時間差,以及網(wǎng)絡延時常摧,導致實際攻擊效果發(fā)生變 化搅吁。考察現(xiàn)有的NTP協(xié)議等技術手段落午,通常都只能達到毫秒級別谎懦,畢竟網(wǎng)絡延時擺在哪里,很難解決這種級別的誤差溃斋。高精度的時間協(xié)議PTP可以達到毫秒級界拦, 倒可以考慮,但他測量網(wǎng)絡延時的算法個人認為有缺陷盐类。PTP和NTP一樣寞奸,對網(wǎng)絡延時的差異做出了假設。
我認為關于時間同步上在跳,存在幾個確定因素:
1、在同一臺機器上隐岛,他的時間頻率精度是足夠的猫妙,比如每秒多少個時鐘周期。
2聚凹、AB兩臺機器之間時間差不會時間推移而改變割坠,除非作出調整。這個可以根據(jù)因素1作出判斷妒牙。
從因素2我們知道W = T-TA 是個常量彼哼,當T1發(fā)生報文并T2到達A區(qū),那么T2-T1==W + D湘今,包含了網(wǎng)絡時延和時差敢朱。在NTP和PTP協(xié)議中,都對D作出了假設,NTP假設D是一定拴签,而PTP假設D是可測量孝常。
我有兩個方案,事實上也是基于對延時的假設蚓哩,方案1:
1构灸、假設在同一局域網(wǎng)內每個客戶端接收到廣播的延時是一樣。這個可信度還是很高岸梨,在局域網(wǎng)內喜颁,誤差可以少于納秒級別。
2曹阔、在同一局域網(wǎng)內洛巢,存在一個時間服務器S,定時向整個局域網(wǎng)廣播當前時間次兆,精度可以達到納秒NS稿茉。
3、當A分區(qū)向B分區(qū)發(fā)送關聯(lián)時芥炭,將A區(qū)接收到S的廣播時間以及關聯(lián)發(fā)生的時間也發(fā)送給B漓库。那么B分區(qū)根據(jù)自己接收到S的廣播時間,能容易推算出A/B兩分區(qū)之間的時間差园蝠。
第二套方案渺蒿,比較復雜:
1、S/C都在同樣的本機時間點向對方時間報文彪薛,并記錄對方報文到達的時間茂装。
2、S收到C的時間報文后善延,將本地收到的時間點封包發(fā)送給C少态。
3、C根據(jù)收到的報文推算和S的時間間隔易遣。
這套方案同樣對網(wǎng)絡延時作出假定彼妻,認為同時向對方發(fā)送報文的延時D1/D2,以及服務器S緊隨發(fā)送的報文的延時D3在發(fā)送時間越接近的情況下豆茫,他們的之間誤差就會越小侨歉。
盡管多個服務器之間的時間同步很重要,但很多情況下揩魂,卻無需借助精確的時間精度幽邓,而只需要知道他們發(fā)生的順序就可以了。R1生成的關聯(lián)A1火脉,R2生成的關聯(lián)A2牵舵,這兩個關聯(lián)各自取了所在區(qū)A和B的時間戳柒啤。假設他們的精度要求為毫秒,而AB區(qū)之間的時間誤差為N毫秒棋枕,網(wǎng)絡時 延為M毫秒白修。當A1/A2發(fā)生時,他并不知道對方的時間戳重斑,A1通過網(wǎng)絡傳輸?shù)竭_B區(qū)兵睛,作用在R2上面,如果這時候R2發(fā)生擊退效果窥浪,實際上A2關聯(lián)并不 發(fā)生祖很。如果A2實際發(fā)生,表示R2在被擊中的時候漾脂,就已經發(fā)生攻擊行為假颇。考察這個過程骨稿,一個很有趣的現(xiàn)象發(fā)生了笨鸡。R1/R2之間的關聯(lián)實際和時間之軸沒有 關系。如果我們一定要在A1/A2打上時間之軸標簽坦冠,并嚴格進行排序形耗,實際上,A1發(fā)生并作用在R2時辙浑,我們并不知道A2的存在激涤。
這篇是我寫得最郁悶的,我仔細研究各種關于時間同步的協(xié)議判呕,盡管吹得天花亂墜倦踢,可是仔細研究起來,都做了許多假設侠草,很難讓人信服他們的精度數(shù)據(jù)辱挥,只能從頭開始自己弄。