io遊戲開發用到的技術和注意的事項

io遊戲開發用到的技術和注意的事項

來自專欄 IT大咖說2 人贊了文章

內容來源:2017年6月18日,頑夢數碼科技程序員大城小胖在「2017 iWeb峰會·第六屆HTML5峰會」進行《Connecting People ---- 獨樂樂 不如眾樂樂》演講分享。IT 大咖說作為獨家視頻合作方,經主辦方和講者審閱授權發布。

閱讀字數:2212 | 6分鐘閱讀

嘉賓演講視頻及PPT,請點擊:t.cn/ReWCbmW

摘要

io遊戲大致是指具有多人對抗+地圖限制+死後即刻復活等為特點的休閑moba類競技遊戲,在近幾年內發展迅速。

io&HTML5

HTML5這個領域在過去的一年多並不平靜,大家都在躍躍欲試。

從去年開始有一種以「.io」為結尾的遊戲闖入人們視野,今年發展更加壯大。iogames.space是一個io遊戲的聚合網站,在上面可以試玩體驗很多io遊戲。

我今天想要分享的是我們在io遊戲在開發時要用到的技術和注意的事項。

在此之前我先了解一下所有網遊的基本原理。就是客戶端輸入一些東西傳到伺服器,伺服器做一些處理,把最新坐標計算出來,再返回給客戶端。客戶端根據最新的坐標渲染去渲染這個角色的最新坐標。無論什麼網路遊戲,其核心原理都是這樣。

TCP vs UDP

我們在做網遊的時候都會涉及到底層協議的選擇,對TCP和UDP進行全面的比較,而有些人還會嘗試綜合使用。

在HTML5領域裡我們沒有太多的選擇。Ajax無法實時響應;WebRTC現在不夠普及,即使將來普及了,在做聯機遊戲的時候會有一些天生的瓶頸。所以我們唯一的選擇就是Websocket,協議也就只能使用TCP。

現在越來越多的遊戲在嘗試使用TCP,它是現在很流行的一種技術。用Websocket做網路遊戲是完全可行的。

優化

Websocket在網路上有一些天生的缺點,還是要嘗試優化。

我們盡量採用二進位數據。

在存數據包的傳輸時,已經有很成熟的一些協議和技術來幫助我們做技術壓縮。Protobuf是谷歌領先創立的一個協議,有很多實現,我們可以用它來做數據壓縮。Protobuf非常強大,不僅可以用於做數據壓縮,還有協議的一些定義等等,使用起來比較複雜。

Msgpack是一個更簡單的協議,網上有各種各樣的實現,它們之間的性能或者API介面都會有一些細微的差別,大家可以根據自己的需求選擇。

避免使用「納格演算法」,現在瀏覽器里的Websocket都已經關閉了納格演算法。選服務端模型的時候需要注意這一點。

還有一個優化方式就是使用多路Websocket解決TCP擁堵問題。一個服務端跟伺服器之間並不僅僅建立一個Websocket鏈接,會建立若干個鏈接,同時傳輸數據。來解決TCP協議天生的缺陷。

影響體驗的網路因素

常見的因素有帶寬、Ping值、丟包、往返傳輸時間和命令等候隊列。其中最重要的是帶寬、Ping值和丟包,這三條是無解的問題。

性能優化的本質

性能優化的本質是用戶體驗的優化,而用戶體驗優化中最後的救命稻草是「欺騙」。

比如進度條就是對用戶最好的欺騙,以及很多UI層面的動畫都是一種「欺騙」,讓用戶覺得自己沒有在乾等,或者讓用戶產生錯覺,覺得性能並不差。

在網路遊戲中也是同樣的道理,我們永遠無法解決網路的帶寬、Ping值和丟包這些問題的時候,我們能做的就是「欺騙用戶」,讓用戶覺得網路很流暢,遊戲不卡頓。

「騙術」

客戶端有兩種常見的「騙術」,一種是客戶端加入插值延遲,用戶看到的移動的角色並不是真實的自己,而是一個插值計算後的結果。

另一個是預測。用戶按了一個鍵後,把這個發給服務端的紅石,客戶端自己先進行預測,然後根據服務端返回的結果來修正客戶端預測的結果。客戶端預測降低服務端的推送頻率。

當遊戲並不是強競技類的時候,可以不再強求一致性,伺服器不再權威,可以放棄一些東西,採用新的技術來處理問題。

將錯就錯

選項一:A打到了B,但是B沒有死。

選項二:A沒有打B,但是B突然死了。

這兩種情況中,選項一是更好的做法。選項一滿足了攻擊方的視覺體驗,也滿足了被攻擊方的結果預期。

修正

像守望先鋒這種大型的比較複雜的遊戲,或者是對競技性、公平性要求高的遊戲,服務端會緩存歷史狀態,當發生爭議的時候可以倒帶,根據過去某個時間點的情況來進行判斷,然後再重播,達到同步。

本質

聯機遊戲的本質就是要處理三個問題:你眼中的你、伺服器眼中的你和別人眼中的你。

每一個遊戲玩家都有三個這樣的克隆體,而這三者間總會有各種各樣的差異。我們在技術允許的條件下可以用各種手段去更精確地判斷。

核心原則就是把這三者處理好,讓它們儘可能一致、儘可能的自然。

NPC

NPC是非玩家控制角色,通常由服務端進行管理,但在遊戲架構上來講,會把這部分隔離開。有很多網遊會設計一個專門的機器來跑NPC,而對於真正的遊戲客戶端來說,NPC也是一個玩家,這種架構能讓遊戲服務端很多邏輯變得非常簡單。

NPC偽客戶端可以放在服務端,也可以放在獨立的一台伺服器上,甚至還可以用一些技術把它委託給玩家。

這其中很多細節還是要結合遊戲的玩法、類型以及自己真實網路的情況等等來做選擇,沒有完美的標準答案。

定性AI

在演算法上保證NPC行為的「可確定性」,客戶端各自處理NPC,無需同步NPC數據,盡量避免「混沌理論」。

混沌理論

混沌理論是關於非線性系統在一定參數條件下展現分岔、周期運動與非周期運動相互糾纏,以至於通向某種非周期有序運動的理論。

定性AI與NPC

做好關鍵元素的網路同步,使用可控的隨機因子,客戶端緩存NPC歷史數據,客戶端對NPC行為進行修正。

單路TCP

客戶端通過一個Websocket往服務端傳送四個數據。

TCP擁堵

數據包①傳過去了,在傳數據包②的時候發生了擁堵。因為TCP是一個可靠的傳輸協議,它會保證數據包的順序。所以②堵住了,後面的③、④都會擁堵。TCP底層發現擁堵的時候會等待、嘗試重試等等。這也是TCP不如UDP很重要的一點。

多路TCP

多路TCP就是客戶端連服務端的時候會起多個Websocket,可以改善擁堵的問題。

在過去的十幾年,服務端相關的技術變化並不大,變化的主要是我們的網路環境、部署情況、運維策略等等。但是在遊戲邏輯層,在處理延遲這個問題上,邏輯是差不多的。

我今天的分享就到這裡,謝謝大家!

推薦閱讀:

H5小遊戲、獨立遊戲、AR……遊戲行業下一個風口是什麼
Unity 遊戲框架搭建 (十五) 優雅的 ActionKit(QChain)
讓更多優秀遊戲得到關注,indiePlay2018中國獨立遊戲大賽報名開啟
Unity使用C++作為遊戲邏輯腳本的研究
從玩到做:快速入行遊戲講解——遊戲誕生流程

TAG:遊戲開發 | HTML5 | 計算機網路 |