上下文:多用户应用程序(的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