【发布时间】:2012-03-23 02:22:43
【问题描述】:
上下文: 多用户应用 (node.js) - 1 个画家,n 个客户端
画布尺寸: 650x400 像素(= 260,000 像素)
对于要频繁更新的画布(我在考虑每秒 10 次),我需要保持数据大小尽可能小,尤其是在考虑上传速率时。
toDataURL() 方法返回一个 base64 字符串很好,但它包含我什至不需要的大量数据(每像素 23 位)。它的长度是 8,088(没有前面的 MIME 信息),假设 JavaScript 字符串有 8 位编码,这将是 8.1 KB 的数据,每秒 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 作为数据结构?
提前致谢,
哈蒂
【问题讨论】:
标签: javascript algorithm node.js canvas base64