Android 如何通过 Socket 高效率发送 int 数组
发送端想把 bitmap 发送给接收端。
接收端只需要 bitmap 的 int[]数据
下面代码是发送端把 bitmap 转成 int[]
int[] data = new int[width*height];
bitmap.getPixels(data, 0, width, 0, 0, width, height);
如何把这个 int[] data 发送给接收端。
数据量大约是 80,0000 的长度
Socket 不能直接发送 int[]
我试过把 int[]转成 byte[]在发送,但是转换花的时间太长,要求在 5ms 以内
如果我直接把 bitmap 转成 byte[]
byte[] data = new int[width*height];
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, data);
这种方法会好一点,但是也要花 30ms 左右,达不到我的要求。
如果发送的是 byte[],接收端还得转回 int[]才能用,也太耗时
我的接收端只想要 bitmap 的 int[],谁有什么办法吗?
1
stonefeng 2020-05-19 16:46:37 +08:00
如果 socket 是基于 udp 协议的话,每个数据包的最大容量是 1472 字节(包含 header ),800,000 字节的长度肯定是无法单个数据包传输过去的,可以考虑使用 redis,这边存,那边取,避免了 upd 数据包容量的限制。
|
3
rrfeng 2020-05-19 16:56:56 +08:00 via Android
啥 socket ?通过网络吗?还是本机?还是局域网?
800000bytes/5ms = 160MBps 难 |
4
asAnotherJack 2020-05-19 16:57:15 +08:00
标题问的是传输效率,正文好像说的是转换效率
为什么要求一定控制在 5ms 呢,图片大的话转换时间变长也正常,如果是防止客户端卡顿可以把转换过程放到子线程,主线程加个 loading 框 |
5
stonefeng 2020-05-19 16:57:26 +08:00
@atfeel socket 本身是一种高效率的数据传输方式,如果你要通过 socket 传输 800,000 字节长度的数据的话,我建议你对在发送端对数据进行拆包,在接收端进行整合,但是注意 upd 协议在数据完整性上不如 tcp,要在整合时要检测数据掉包,如果数据不完整则需要有重试机制
|
6
May725 2020-05-19 18:35:10 +08:00 via iPhone
楼主还是说下原始需求吧
|
7
iceheart 2020-05-19 19:35:34 +08:00 via Android
800k/5ms = 160M 字节 /秒,
再考虑网络波动,我判断你的需求应该是本机数据传输,否则没法实现。 本机传输可以考虑文件映射 |
8
wuketidai 2020-05-19 19:58:11 +08:00
人家实时直播手机录屏都可以,所以无论如何都是 lz 姿势不对
|
9
WispZhan 2020-05-19 19:58:55 +08:00
我没细算,默认楼上们都是对的。
让我想到一个笑话: 机房在美国,客户在国内, 客户要求从国内访问美国机房网络延迟控制在 30ms 以内。 |
10
weishu 2020-05-19 20:20:15 +08:00
用 jni 肯定可以。你这分配这么多临时内存,Android 的 gc 不行的。
|
11
CoderGeek 2020-05-19 20:23:45 +08:00
网络?
|
12
atfeel OP @rrfeng 用 int[] data = new int[width*height];
bitmap.getPixels(data, 0, width, 0, 0, width, height);转成 int[] 800000 仅用了 30ms, |
15
muzuiget 2020-05-19 21:40:45 +08:00
明明瓶颈就是在二进制序列化,socket 本身就是二进制流,根本就不关心你发了什么数据结构。
|
16
muzuiget 2020-05-19 21:45:36 +08:00
bitmap 对象应该直接获取二进制数据的方法或者属性,可能就是一个带 IO 之类的 Stream 接口,让你直接 read/write 就完事了,给你 int[] 多半就是让你做图形变换之类,你只是发送数据,就不需要这种操作。
|
17
march1993 2020-05-19 22:04:59 +08:00
类似 png 这种 低频部分在前高频部分在后 让接收端可以渐进地展示清晰图不行吗。。。
|
19
mtdhllf 2020-06-03 11:30:51 +08:00
用 netty 发,不存在不能发送 xx 对象
|