上下文:多用戶應用程序(的node.js) - 1個畫家,正客戶最小化畫布 「位圖」 的數據大小
帆布尺寸: 650x400像素(= 260000像素)
對於畫布會經常更新(我每秒思考10次),所以我需要保持儘可能小的數據大小,特別是在考慮上傳速率時。
返回base64字符串的toDataURL()
方法很好,但它包含我甚至不需要的大量數據(每像素23位)。它的長度是8,088(沒有前面的MIME信息),並假設JavaScript字符串具有8位編碼,即8.1千字節數據,每秒10次。
我的下一個嘗試使用JS對象用於不同環境的行動像moveTo(x, y)
或lineTo(x, y)
,將它們發送到服務器,並有客戶收到增量更新數據(通過時間戳)。然而,這比base64字符串效率更低。
{
"timestamp": 0,
"what": {
"name": LINE_TO,
"args": {"x": x, "y": y}
}
}
,因爲有近300 lineTo
命令已經當您聯繫您的刷卡刷它不流利,也沒有精確的工作。有時候會有一部分運動缺失(使一條直線而不是四捨五入),有時事件甚至不會被腳本客戶端識別,因爲它似乎已經被已經觸發的大量事件「淹沒」了。
所以我必須最終使用8.1 KB的base64字符串。我不想擔心這一點 - 但即使與增量更新異步完成,實際服務器上也會出現嚴重滯後現象,更不用說偶爾帶寬超限了。
我使用的唯一顏色是#000和#FFF,所以我只考慮1位數據結構,只有增量更新。這基本上就足夠了,我不介意任何「顏色」精度損失(畢竟它是黑色)。
由於大部分畫布都是白色的,您可以考慮使用額外的Huffman遊程編碼來進一步縮小尺寸。像的尺寸50X2像素中,並在一個單一的黑色像素畫布(26,2)將返回以下字符串:75W1B74W
(50個+ 25的白色像素,然後1個黑色像素,則24個白色像素)
它即使倘使畫布由1位串這樣的:
00000000000000000000000000000000000000000000000000
00000000000000000000000001000000000000000000000000
這將有很大的幫助了。
我的第一個問題是:如何寫一個算法來獲得這個數據高效?
二是:我怎麼能(通過節點服務器)通過純二進制數據帆布的客戶呢?我怎樣才能將1位數據結構發送到服務器?我需要將我的位轉換爲十六進制(或更多)的數字並重新解析嗎?
是否可以使用this作爲數據結構?
由於提前,
哈爾蒂
是的,這也是我第一次想到的(我也是這樣做的)。 我使用的對象類似如下: '{ \t 「時間戳」:0, \t 「什麼」:{ \t \t 「名」:LINE_TO, \t \t 「ARGS」:{ 「X」: X, 「Y」 爲:y} \t \t} }' 然而,大約60X40像素的單刷線,你有超過300個這樣的命令了。 但是,簡單(較短)的字符串而不是對象的想法聽起來也很不錯。 對象對我來說並不是很流利(在localhost上)。 Base64字符串確實可以流暢地工作,但恐怕只有LAN節點服務器纔是這種情況。 – Harti 2012-03-06 10:12:47