【譯文分享】HTML5實現多人實時3D遊戲

2021-02-26 粵嵌IT研發編程技術宅

原文:http://blog.artillery.com/2012/05/realtime-multiplayer-3d-gaming-html5.html

這篇文章國內有些機器譯的版本,但實在太難閱讀,這裡試譯了下。
由於譯者水平有限,可能會有不少錯漏之處,一些不明確是否譯準的地方附了原文。
此文涉及挺多框架/庫,在翻譯過程中ip收穫還是挺多的,建議大家在閱讀時可以同時去了解下文中所提到的相關技術。
【提示:此文不是」跟我學做HTML5遊戲」之類的教程文章】


—————————————–譯文分隔線————————————-

六周前我們想試下用HTML5實現一個twitch3D遊戲是否可行。最終我們完成了幾個遊戲且很意外我們所達成的效果。

你可以試下其中一個遊戲:Air Hockey

圖形

目前多數瀏覽器對WebGL的支持已經很好,three.js是對使用WebGL很有用的庫。它提供了簡潔的API,內建的實用功能,通信模塊等,其缺點是…文檔很少。不過你可以通過很多現存例子來學習如何實現你所需要的功能。

一些例子使用了 state.js 和 dat.GUI 來監控頻幀和修改設置,這兩個庫都是非常有用的。dat.GUI 可用於微調延遲補償算法及遊戲外觀,如光強,材料屬性等。

我們從 TurboSquid 買了遊戲中所需的3D模型 (air hockey, mallet and puck) ,感謝 three.js 的 Blender 導出插件,依靠這個插件我們可以輕易地把Blender的場景(使用了買來的模型)轉為json格式以用於瀏覽器。在分離模型,調整材料和減少多邊形的數量的過程中,我們磨練了Blender使用技巧以優化文件大小。

Blender 界面

如果你是剛接觸 3D, WebGL 和 three.js將會顯得比較艱澀,因為這裡面會有很多陌生的術語和概念。由於我們都不熟悉3D,所以在光線和材質的調整上花費了不少時間。我們反覆嘗試了各種調整,反覆地刷新,體驗效果。當看到Mr.doob 在RO.ME項目上的演講 (需翻牆)時,才想到有個更好的辦法,那就是在合成最終效果前把各個部件先分離成單獨的小demo以便於調節效果。

網絡通信

我們想試下創建一個能及時響應低延時,挑戰玩家反應的遊戲是否可行,air hockey看起來很合適。移動冰槌和冰球需要良好的網絡性能。而只要網絡稍有延時,這個遊戲的可玩性就大大降低。幸好,WebSocket提供了很好的性能。

我們的網絡方案相對簡單,但這已經路以證明我們的觀點:用HTML5來實現互動(twitch,不知怎麼翻譯)遊戲是可行的!,網絡方案如下:

當然,延時會使這個處理過程變得複雜。如果從服務端到客戶端的數據包需要50毫秒,那麼玩家最終看到的界面就是50毫秒前的,這使得玩家很難擊中冰球。針對此問題我們的解決方法是:

如此,玩家就不需要自己計算延時所導致的位置誤差來擊中冰球了。

還有很多流行的以驗證有效的滯後補償技術可以提高遊戲的可玩性。不過我們的demo裡僅使用上述方法–90年代的遊戲聯網技術,因為這已經足以讓我們創建一個有趣的、實時的、瀏覽器上的多玩家遊戲了。

另外,值得一提的是,一切應該以服務端數據為準,所有的實時多人遊戲裡都是如此防範作弊的。

JavaScript

我們認為以 HTML5為前端 + Node.js為後端 這樣的形式進行開發,可以減少開發時間,因為這樣客戶端和服務端可以復用代碼。特別是在實時遊戲裡,因為這種情況下,前後端需要相同的模擬計算邏輯。與之前的項目相比,把客戶端和服務端中相同邏輯復用的方式,為我們節省了約30%的時間。

我們嘗試使用RequireJS編寫客戶端代碼,但是用 AMD(Modules/AsynchronousDefinition) 的方式來封裝我們所有的代碼的話,那會讓人隨時受不了的!幸好我們發現了Browserify這一神器,它提供了很多 Node 標準庫的實現封裝。這樣的代碼 events = require 『events』class Game extends event.EventEmitter可以同時在服務端和客戶端運行。可惜的是Browserify不能兼容Backbone.js,為此,我們寫了50行CoffeeScript來替換Backbone.js中我們所需要的功能。

選擇 CoffeeScript 而非直接寫 JavaScript 是因為這樣可以精簡代碼量,而且所有的Node管理工具(如nodemon,forever)似乎都支持CoffeeScript。一開始我們擔心用 CoffeeScript 寫的代碼難以調試,但事實證明,CoffeeScript 生成的js代碼極具可讀性。

Browserify 使用了新的代碼映射標準,這有助於使用Chrome開發者工具遊覽代碼,相信不需要多久我們就可以在遊覽器上直接調試CoffeeScript了。(譯註:chrome上已經可以直接調試CoffeeScript,相關連結http://ryanflorence.com/2012/coffeescript-source-maps/)

性能與優化

上文已經提到,我們用Node.js來當服務端,除了 Node.js,我們覺得沒別的方案可以實現我們讓服務端和客戶端跑相同代碼的需求了。目前為止,我們對 Node 的性能相當滿意,在我們的負載測試中,512M 的Rackspace VM機可以同時良好地支撐100左右個遊戲進行。因為性能如此良好,我們幾乎沒花時間進行優化。

關於HTML5的性能討論,無可避免地涉及到GC(Garbage Collection), 而在最初,我們發現GC的暫停可能會導致遊戲出現明顯停頓( and we were initially concerned that GC pauses might cause noticeable pauses in game play ),Chrome無此問題,只有FireFox在跑Air Hockey時才會出現明顯的光滑度光點( there are noticeable blips in smoothness),我們認為這和GC有關。不過,我們並沒在這上面花工夫去減少GC出現的數量,當然,我們認為,如果在代碼寫得更小心些以減少垃圾,在Firefox可能會獲得更好的性能。

收穫

遊覽器上的遊戲開發,最大的障礙是工具的缺乏。我們看到有很多遊戲框架,但要麼對遊戲的開發方式有限定,要麼就是他們被收購了又或者是沒有發布(譯註:這句看得莫名其妙,原文: We see a lot of frameworks, but they either constrain you into making your game a certain way, or they get acquired and are never released.) 關於遊戲開發的優秀的庫和組件很多,但開發者需要自己去把他們組合起來。

Flash 和 Unity 已經建立了一個良好的開發環境,iOS和Xbox Live Arcade平臺,也提供了終端到終端的解決方案以創建和發布遊戲。但瀏覽器平臺還是太新,寫HTML5遊戲就像寫彙編代碼一樣麻煩。在我們的開發過過程中,我們找不到一個滾動條來調節冰球的顏色或者光線的強弱。要得到效果我們就必須跑起來又或者在從一個很複雜的軟體裡得到字面上的代碼。( if we wanted any of that we』d have to build it or buy in (literally) to a heavier framework.)

我們非常高興能看到瀏覽器上實現一個接近手抦控制的同步多人遊戲的可能性。作為 StarCraft 和 Halo 的粉絲,我們已經準備好看到這兩者在瀏覽器上的出現,同時我們也希望能激起你對它們在瀏覽器上出現的期望。

************************

如何分享到朋友圈

點右上角按鈕→ 分享到朋友圈

如何關注「嵌入式研發編程技術宅」

1進入微信「通訊錄」→點右上角「添加」→在查找公眾號裡搜索「嵌入式研發編程技術宅」

2或搜索微信號:ittechshare

3也可掃描以下二維碼關注:

************************

相關焦點

  • 遊戲開發完整學習路線!就是一門實時渲染的藝術!
    我們工作大多數時候也不會自己開發遊戲引擎,所以這樣對於一般的日常工作也沒什麼大礙。對於只使用遊戲引擎的人來說,入門階段要做的就是看該引擎的教程(書籍、視頻、網上博客、網上教程、官方幫助文檔等),並且熟練該教程所使用的程式語言。 所以你要做的第一件事,就是去了解現在流行的遊戲引擎。
  • Vise3D引擎全面支持VR遊戲研發
    在此次的雲棲大會上,Vise3D展示的虛擬與現實結合的技術是Vise3D團隊最新的研發成果,該技術可以實現通過精準的動作捕捉及圖形處理,將攜帶VR設備的體驗者及其現實使用場景,與VR設備中的虛擬世界場景進行結合,並以直觀的方式展示到外界輸出設備上供需要的人進行觀看。
  • 基於HTML5的WebGL經典3D虛擬機房漫遊動畫
    第一人稱在 3D 中的用法要參考第一人稱在射擊遊戲中的使用,第一人稱射擊遊戲(FPS)是以第一人稱視角為中心圍繞槍和其他武器為基礎的視頻遊戲類型 ; 也就是說,玩家通過主角的眼睛來體驗動作。自從流派開始以來,先進的 3D 和偽 3D 圖形已經對硬體發展提出了挑戰,而多人遊戲已經不可或缺。
  • 使用Unity和HTML5開發移動遊戲的優缺點
    Unity由Unity Technologies開發的一個讓玩家輕鬆創建諸如三維視頻遊戲、建築可視化、實時三維動畫等類型互動內容的多平臺的綜合型遊戲開發工具,是一個全面整合的專業遊戲引擎。HTML5HTML5與JavaScript結合開發,利用h5畫布可以模擬現實物體運動,現在我們常見在小遊戲畫面,不管是2d遊戲還是3d遊戲,H都是開發的得心應手。
  • 【佳瑾學習】如何從Flash轉換到HTML5
    為什麼不採用Flash了 Flash可以說是課件開發中最流行的一種形式了,通過它可以創建遊戲最終這一需求導向了html5,因為html5能夠提供靈活而強大的學習體驗。 從Flash轉換到HTML5的五大關鍵點 1.萃取要啟動轉換過程,首先要確保你拿到所有必須的內容、媒體和支持材料。沒有它們你無法順利轉換。集合完整的材料,會讓整個轉換過程減少一些繁瑣細節,更及時,更少錯誤。
  • 怎麼理解Html5?Html5和html4相比有哪些優勢?怎麼學好html5?
    ,html5應用凝結很多人的心血,作為下一代超文本標記語言的核心,html5主要增加了新元素互操作性主要是針對行動裝置和多媒體。html5是現在前端培訓比較火熱的語言,今天為大家簡單介紹一下html5語言。Html5和html4相比有哪些優勢?
  • 使用HTML5畫布實現的超棒javascript動畫儀錶板:gauge.js
    使用HTML5畫布實現的超棒javascript動畫儀錶板:gauge.js 在線演示今天我們分享來自guage.js的超棒動畫儀錶板實現,這個類庫使用
  • 淺談如何實現HTML5的離線存儲
    關於HTML5離線存儲原理及實現,筆者找到一篇介紹離線緩存的,感覺比之前看到的解釋的更透徹,新的知識點記錄如下:大家都知道Web App是通過瀏覽器來訪問的,所以離線狀態下是無法使用app的。其中web app中的一些資源並不經常改變,不需要每次都向伺服器發送請求。這時應運而生的離線緩存就顯得尤為突出。
  • 優秀設計師常用到的HTML5動畫工具
    對於創建遊戲、生成藝術和其他高度圖形化的體驗非常有用。 它可以很容易製作可擴展的交互式動畫,複雜的遊戲,視頻,演示,app和多媒體網站。比其他任何HTML5動畫製作軟體能發布更多在網頁瀏覽器和設備上。
  • 在手機上實現實時的單目3D重建
    在手機上實現實時的單眼3D重建  這是一篇由浙江大學和商湯合作完成,在ISMAR2020 上獲得BestPaper的研究。    本文展示了在手機上實現實時單眼3D重建的系統,稱為Mobile3DRecon。該系統使用嵌入式單眼相機,在後端提供了在線網格生成功能,並在前端提供了實時6DoF姿勢跟蹤,以供用戶在手機上實現具有真實感的AR效果。
  • 友盟+推出微信小遊戲統計,實現多平臺覆蓋的跨域運營
    小遊戲以其極輕極快的形式實現了對大眾用戶的不斷滲透,至2019年,小遊戲平臺已經累計為超過10億用戶提供過內容服務,未來小遊戲商業規模可能以38%-40%的速度高速增長,有巨大想像空間;對於開發者來說,2020年小遊戲仍值得入場。
  • html5中progress標籤(進度條)的詳細介紹
    本篇將介紹html5中progress標籤(進度條)的詳細用法,有興趣的朋友可以了解一下!在html5中新增了很多實用的標籤,今天小編介紹的就是其中一個,即progress標籤。學會progress標籤,可以讓我們很輕鬆的創建一個進度條,接下來跟著小編一起來學習吧!
  • Unity官方示例:在ARCore和ARKit中實現多人遊戲
    但是不少開發者都向雷鋒網表示由於ARKit目前還難以支持多人遊戲,大大降低了AR遊戲的社交性和可玩性,也限制了遊戲場景。在Unity Austin 2017中,Unity向大家介紹了如何在Unity中使用ARKit和ARCore,以及如何解決多人遊戲的問題。此文原發於「Unity官方平臺」公眾號,雷鋒網獲授權轉載。
  • html5中nav標籤(導航連結)的詳細介紹
    本篇將介紹html5中nav標籤(導航連結)的詳細用法,有興趣的朋友可以了解一下!在html5版本中,新增了很多語義標籤,比如:header標籤、footer標籤、aside標籤、nav標籤等等。這些語義標籤沒有實際的顯示效果,只是起到語義的作用。今天小編要介紹的就是其中一個,即nav標籤。
  • Cocos Creator 3D 物理模塊介紹
    為了讓遊戲開發更加簡單、友好和高效,Cocos Creator 3D 在研習和摸索中設計了一套比較基礎的物理組件,並且還在持續完善中。儘管當前的組件功能還十分有限,但是相信在有了之前的組件設計經驗後,很快就可以有更多強大且易用的物理組件。另外,我們還對物理模塊設計了一套抽象層,這是物理組件能夠發揮其功能的底層支持,也是我們為多物理後端打下的基礎。
  • 入行遊戲3d建模,能得到多少「麵包」?
    中國的遊戲產業從興起到現在,不久,而現在正處於一個快速發展的關鍵黃金時期。遊戲原畫市場已經漸漸地偏向飽和了,但遊戲3d建模市場尤其是次世代的崗位缺口仍然很大,並且伴隨著次世代技術的不斷發展進步,這個崗位需求還會越來越大。沒有美術基礎,只有興趣愛好不能學?
  • 為什麼越來越多的人開始學Unity3d遊戲開發?
    為什麼越來越多的人開始學Unity3d遊戲開發,其實主要原因是我因為遊戲產業和VR技術的發展火爆。無論是PC遊戲還是手機遊戲,最近幾年都呈現井噴爆發式的增長,而國內Unity3d遊戲開發相關技術人才還有很大的缺口,可以說非常緊缺。
  • Unity3D 推薦的7個項目和案例練習
    target=http%3A//forum.china.unity3d.com/thread-23645-1-1.html今天我們繼續為大家分享一篇教程:教大家在Unity中製作一款文字冒險遊戲。遊戲靈感來自於「火柴人亨利(Henry Stickmin)」系列遊戲,以及一些上世紀80年代的《驚險岔路口》冒險叢書。遊戲根據玩家的不同選擇來展開故事情節,通常會擁有多重結局。
  • 抖音火球爆炸3D遊戲介紹[多圖]
    極具魔性的抖音遊戲,再度迎來了一位強力大將,就是我們今天的主角《fire balls 3d》,這款遊戲在抖音上可謂是火爆一時,很多並不經常玩抖音的人,對這款遊戲也許不是特別熟悉,現在小編就來為大家介紹fire balls 3d遊戲的玩法,看看這款被稱之為抖音神作的遊戲有何特色。
  • 9款令人驚嘆的HTML5 3D動畫應用
    在線演示/源碼下載2、HTML5夢幻特效 可給任意元素添加魔幻效果我們之前介紹HTML5動畫特效比較多的是HTML5 3D特效,今天我們來換一種風格,來分享一款看起來比較魔幻的HTML5特效。這款HTML5 3D動畫非常酷,它的實現離不開js動畫框架TweenMax。