使用字节[]发送游戏更新,并在javascript中转换为数字

使用字节[]发送游戏更新,并在javascript中转换为数字,javascript,typescript,Javascript,Typescript,这可能是重复的,但最好的答案是相当老的(也许有新的东西?),我也想以一种开放式的方式来处理这一问题,并提出一个更广泛的问题,即是否有更好的方式以性能方式发送数据,而不是我正在尝试的方式 我目前正在使用由C#server运行的webrtc制作一个实时游戏 为了更新客户端,我目前正在使用此代码将数字转换为字节[],然后我可以将其发送到客户端(为了最小化数据,这将转换为50字节)。这很重要,因为我将每秒发送几个更新 public static byte[] UserLocationToByte(lon

这可能是重复的,但最好的答案是相当老的(也许有新的东西?),我也想以一种开放式的方式来处理这一问题,并提出一个更广泛的问题,即是否有更好的方式以性能方式发送数据,而不是我正在尝试的方式

我目前正在使用由C#server运行的webrtc制作一个实时游戏

为了更新客户端,我目前正在使用此代码将数字转换为
字节[]
,然后我可以将其发送到客户端(为了最小化数据,这将转换为50字节)。这很重要,因为我将每秒发送几个更新

public static byte[] UserLocationToByte(long userId, double x, double y, double r, double dx, double dy)
{
    var msg = new List<byte[]>
    {
        BitConverter.GetBytes((short)DataMessageType.Location),
        BitConverter.GetBytes(userId),
        BitConverter.GetBytes(x),
        BitConverter.GetBytes(y),
        BitConverter.GetBytes(r),
        BitConverter.GetBytes(dx),
        BitConverter.GetBytes(dy)
    };

    var t = msg.SelectMany(a => a).ToArray();
    return t;
}
在javascript/typescript中搜索时,我发现没有简单的方法可以做到这一点

我可以只发送带有|分隔符的字符串,然后用javascript解析这些字符串,但这会使数据量增加很多

关于如何在javascript中解析字节[]或以其他方式解决此问题,有什么建议吗


我只支持firefox和chrome没有问题。

好吧,假设一个未签名的int足够大,可以容纳userid

您可以使用数据视图

下面是一个示例,它将返回一个ArrayBuffer,您可以使用它发送数据等

每个集合末尾的
true
用于使用小尾端,这应该与windows上的C#兼容

如果您的浏览器在Chrome上,您可以查看ArrayBuffer中的内容,并确认其外观是否正确

const msgTypeLocation=1;
函数UserLocationToByte(userId,x,y,r,dx,dy)
{
const buffer=new ArrayBuffer(46);
const dv=新数据视图(缓冲区);
设o=0;
dv.setInt16(0,msgTypeLocation,true);o+=2;
dv.setUint32(o,userId,true);o+=4;
dv.setFloat64(o,x,true);o+=8;
dv.setFloat64(o,y,true);o+=8;
dv.setFloat64(o,r,true);o+=8;
dv.setFloat64(o,dx,true);o+=8;
dv.setFloat64(o,dy,true);o+=8;
返回缓冲区;
}
const data=UserLocationToByte(10,20.0,30.0,40.0,10.0,12.0);
控制台日志(数据)

查看Chrome控制台等以查看字节。
您如何准确获取数据客户端,即什么格式(字符串、blob等)?Javascript本身有类型化数组,如Int8Array,它将是一个字节数组,并且值已经是数字。您可能需要查看DataView的,您可能遇到的一个问题是Javascript不支持64位整数。。您可以使用第三方库来解决此问题,。但是你的用户ID必须是64位吗?@PatrickEvans javascript得到了一个int8Array,但是解析这个数组看起来相当迟钝(看看另一个链接的线程)。我担心当javascript每秒接收到50+个这样的值时,这可能不太好。@Keith No我不这么认为,我很确定在达到Int32.MaxValue之前,我还会遇到其他问题。我将对此进行更改。可能还应该包括方法的
get*
版本的示例,因为它们可能希望在客户端使用这些方法来读取值。
// convert it back.
var rtype = (DataMessageType)BitConverter.ToInt16(bytes, 0);
var ruserId = BitConverter.ToInt64(bytes, 2);
var rx = BitConverter.ToDouble(bytes, 2 + 8);
var ry = BitConverter.ToDouble(bytes, 2 + 8 + 8);
var rr = BitConverter.ToDouble(bytes, 2 + 8 + 8 + 8);
var rdx = BitConverter.ToDouble(bytes, 2 + 8 + 8 + 8 + 8);
var rdy = BitConverter.ToDouble(bytes, 2 + 8 + 8 + 8 + 8 + 8);