2012-10-04 47 views
5

林創建8位無符號的JavaScript數組:的Javascript類型數組「通過線路」

var myArray = Uint8Array(64); 

操縱客戶端和服務器上該陣列中,然後將其發送通過socket.io連接。我們正在編寫一個遊戲,因此通過線路發送的數據儘可能小。因爲socket.io不支持發送二進制數據是值得與JavaScript類型數組打擾或應該只使用正常的JavaScript數組?他們仍然會比原生js數組小嗎?

+0

這將取決於您使用什麼序列化庫/ RPC協議通過網絡發送數據。 – millimoose

回答

6

注:我將假設客戶端是指瀏覽器。否則,請詳細說明。

Socket.io不支持二進制數據,主要是因爲它提供了不同的傳輸,並且其中許多不支持它。

但是,本地websockets DO支持Blob和ArrayBuffers。

如果你真的想用二進制數據來提高效率(我同意,這是你的情況),我認爲你應該考慮使用websockets而不是socket.io。

壞:

  • 只有約55%的用戶瀏覽網頁與支持WebSockets的瀏覽器。
  • 你不會有socket.io提供的商品,比如渠道,放出方法。

好:

  • 網絡套接字API是非常簡單的。

  • 它會更有記憶效率。通常情況下,您的普通數組是通過首先將它們轉換爲JSON字符串然後將它們發回來進行傳輸的。這意味着你實際上正在發送數組的字符串表示形式!相反,在這裏您將發送您期望的字節量(以更可預測的方式,在發送之前不檢查字符串長度,而是以更「協議」的方式 - 如果需要的話)。

如果你決定使用WS,你可以檢查此:http://www.adobe.com/devnet/html5/articles/real-time-data-exchange-in-html5-with-websockets.html

否則你可以去用JSON。如果您仍然使用JSON進行socket.io和「通用」支持,也啓用閃存傳輸,並在遊戲需要低延遲時禁用較慢的傳輸。

+0

這就是我想的。儘管你可以讓事情變得更清楚。遊戲是國際象棋......所以速度並不重要,但我正在寫遊戲來學習不寫遊戲。所以我試圖儘可能高效。無論如何,我現在的套路太遠了。另外,正如你所說的,它增加了更高級別的功能,這是很好的。 – AndrewMcLagan

+0

我在想使用JS類型的數組即使沒有二進制套接字也會節省空間,儘管只有少量。我用Uint8Array(64)代表國際象棋棋盤,因爲棋盤上有64個方格。只有12種可能的棋子類型,所以我將它們從1 - 12代表並放置在棋盤陣列中。然後在服務器和客戶端上有一個pieceMap對象,它將片段代碼與片段的名稱相關聯。例如{1:'BlackKnight',2:'WhiteKnight'} – AndrewMcLagan

+1

與普通數組相比,它不會節省空間。當發送到服務器時,它仍將使用JSON完成,因此將被轉換爲字符串。 – Mamsaac