網路遊戲中會涉及到多個終端,各個終端以及伺服器的系統時間都會存在一定的差異。
如何在在遊戲中處理好這種差異呢?
一 使用前端時間
直接獲取終端的時間,用來計時,這種方式是很多單機遊戲使用的方式。
這種方式時存在漏洞的,例如我們記錄進入關卡的時間(客戶端時間),然後開始計時,每10分鐘恢復1點體力。
當我修改了我的客戶端時間之後,體力的值也隨之變化了。
即使在後端做了校驗,前端顯示也會有問題,體驗並不好。
或者如果我前端的時間更快,前端顯示我已經恢復了體力,但是傳送到後端校驗時缺失敗了。
二 使用後端時間
另外一種方式時都使用後端時間,這又會有什麼問題呢?
最明顯的就是當前後端不在同乙個時區的時,獲取的時間並不一致。
另外就是後端的時間每次都去更新比較麻煩。
比如說我要顯示倒計時,每次開啟介面的時候都需要請求一次系統時間,
然後需要另外在開乙個定時器,每秒做一次減一操作。
三 兼顧前後端時間
這是我們遊戲最終才有的一種方法。
就是在登入的時候,請求一次系統時間,然後計算前後端時間的差值,
然後再獲取前端時間的時候,加上這個差值。
這樣就可以完美的解決一二中提到的問題。
但是這又會有另乙個問題,當我登入遊戲之後,然後將遊戲進入後台,然後修改終端時間,
這又會出現一中提到的問題。
我們的解決方法是在從後台進入前台時,重新請求一次後台時間,計算時間差。
lua的**如下:
-- 儲存伺服器對時間差
local timedelta = 0
-- 根據從伺服器請求帶的時間servertime和本地時間os.time()計算出時間差servertime
function setservertime(servertime)
timedelta = servertime - os.time()
end-- 返回本地時間加上時間差之後的時間
function gettime()
return os.time() + timedelta
end
網路遊戲專題 時間同步裝置
在網路遊戲中,有乙個最基本的需求是,如果讓乙個玩家的動作 比如行走 即時地 流暢地在其它的遊戲地理位置相鄰的玩家的螢幕上顯現,如果是在區域網內,這個不是什麼大不了的問題,但是如果遊戲玩家是分散在internet上的使用者,由於網路的延時的影響,使得其成為項頗有難度的 任務。你只要想一下,玩家a發出的...
網路遊戲專題 時間同步裝置
在網路遊戲中,有乙個最基本的需求是,如果讓乙個玩家的動作 比如行走 即時地 流暢地在其它的遊戲地理位置相鄰的玩家的螢幕上顯現,如果是在區域網內,這個不是什麼大不了的問題,但是如果遊戲玩家是分散在internet上的使用者,由於網路的延時的影響,使得其成為項頗有難度的任務。你只要想一下,玩家a發出的訊...
再談網路遊戲同步
呵呵,一年前的這個時候發過一系列討論網路遊戲同步的帖子。一年後的今天,再重新討論討論這個問題。不知道大家是否碰到過這種情況,當某個玩家發出乙個火球,這個火球有自己的運動 軌跡,那麼如何來判斷火球是否打中了人呢?大部分情況,當策劃提出這個要求的時 候,一般會被程式否認,原因是 太麻煩了,呵呵。複雜點的...