朋友催促下,想很快的做出新一版的戰(zhàn)魂,并且添加這4年多來自己所有研究出來的高科技!
對于大量的子彈彈幕和高速微操控制,只有幀同步能解決這個問題,但是中國國內(nèi)對于幀同步研究的人很少,國外也少見這類文章,甚至用google都很難搜到,難不成是我用錯搜索詞?
大學(xué)時期曾經(jīng)看過一本重慶大學(xué)出版社出版的游戲編程。基于DX8寫的,很基礎(chǔ),里面還記得有王鑫寫的幀同步的基本原理。
這里個人總結(jié)下:
- 幀同步,顧名思義:就是每一幀都同步,所以就是真同步
- 由于數(shù)據(jù)量巨大,一般使用UDP做發(fā)送
- 要做到數(shù)據(jù)的絕對同步,延遲不能太大,最好能在局域網(wǎng)來做,延遲20ms以下
- 如果要在公網(wǎng)傳輸,由于采用的是P2P傳輸,因此,UDP的打洞也是必不可少的
因此,可以先定下采用的網(wǎng)絡(luò)庫是Raknet(http://www.jenkinssoftware.com/),從網(wǎng)上down了一個下來看視頻,還是很強(qiáng)大的,雖然用的項(xiàng)目不是很多。不過用于個人的項(xiàng)目已經(jīng)足夠了。
Raknet和XNA下的網(wǎng)絡(luò)庫很類似,支持可信賴的UDP發(fā)送。由于是自定義的傳輸方式,同時,沒有TCP的負(fù)載均衡的復(fù)雜算法,因此網(wǎng)絡(luò)傳輸速度可以很快
在游戲中的幀同步,在我的考慮將是這樣的:
- 游戲中的邏輯幀與渲染幀是不同步的,邏輯幀也許遠(yuǎn)遠(yuǎn)低于渲染幀
- 對于一個使用elapse值在邏輯控制下移動的物體,這個移動算法必須能被時間插值。
- 那么我們將這段時間進(jìn)行分段,每一段就是一幀。我們?yōu)檫@些幀進(jìn)行編號,類似于封裝TCP協(xié)議一樣。這些編號更類似于指令號。
- 游戲中有一人被作為服務(wù)器使用,每個玩家將自己的操作編碼成指令后發(fā)送給這臺服務(wù)器,由服務(wù)器統(tǒng)一分配序號廣播給所有的其他玩家
- 對于可以被時間插值的動畫軌跡(尋路),那么將發(fā)送軌跡(如果尋路算法出來的結(jié)果是唯一的,就只需要發(fā)送起點(diǎn)跟結(jié)尾點(diǎn))以及每幀更新這個物體的時間插值參數(shù)。
- 由于外界輸入對系統(tǒng)的干擾,才產(chǎn)生了需要同步的數(shù)據(jù)。外界輸入干擾保護(hù)用戶操作和AI
- 考慮到每人的網(wǎng)絡(luò)ping值的不同,對于特別慢的玩家,可能在其廣播指令時,其他玩家已經(jīng)走出很多步,因此需要計(jì)算一個平均ping值,當(dāng)網(wǎng)絡(luò)中某人的ping值低于這個值時,將彈出類似于魔獸/星際的同步對話框,等待其本地指令序號趕上其他玩家的序列號
- 由于所有物體的移動都可以被時間插值,因此,游戲中的每一邏輯幀,只需要將本地服務(wù)器在上一幀的ping值和幀號廣播給所有的玩家
- 當(dāng)物體啟動和結(jié)束移動時廣播
- 當(dāng)渲染幀數(shù)下降時,將很明顯的看到幀同步對象有很明顯的"跳躍"現(xiàn)象,這個現(xiàn)象在星際中更是明顯。但在技術(shù)成熟的魔獸中已經(jīng)被插值予以替代


