【问题标题】:What is the correct way to send position updates via WebSockets?通过 WebSockets 发送位置更新的正确方法是什么?
【发布时间】:2014-03-10 20:22:05
【问题描述】:

我需要在使用node.js 运行的游戏世界中广播位置更新。我目前的想法是使用BinaryJS。不过,我不确定使用它的正确方法是什么。我想到了 3 个选项:

我目前的表现如何,使用socket.io:我以编程方式存储在给定时间内发生的位置更新缓冲区,然后一次性发送:

setTimeout(function(){
    //called a fixed amount of times per second (40)
    //this variable will hold the accumulated position changes on the last 25ms
    //var accumulated_position_changes = [id0,x0,y0,z0, id1,x1,y1,z1...];
    client.send(accumulated_position_changes);
},25);

但如果binary.js 自己进行分块(是吗?),那么我是否应该在每次发生位置更改时不加选择地发送位置更改?

MyClass.prototype.set_position = function(x,y,z){
    // this is called thousands times a second
    this.x = x, this.y = y, this.z = z;
    client.send([this.id, x, y, z]);
};

或者我应该以某种方式创建一个派生 node.js 流的对象并使用它?也许是stream.write?还是其他方式?处理这个问题的正确方法是什么?

【问题讨论】:

    标签: javascript node.js networking websocket socket.io


    【解决方案1】:

    在我的用例中,Binary.JS 似乎每次写入管道时都会写入一个数据包。

    为什么不将位置变化写入缓冲区,然后使用 Underscore.js 的节流。您可以调用update() 或其他任何方法,它会一次写入整个更改缓冲区。您可以根据需要随时调用该函数,但使用受限制的版本,以便它实际上最多每 50 毫秒左右运行一次。

    对于 Web 应用程序来说,这种延迟非常快。确保您正在考虑您的客户可以接收和确认该信息的速率。老实说,在数据成功发送和确认之前,我不会更新客户端。否则,对于某些人来说,你的更新率会太高。

    【讨论】:

    • @Viclib 抱歉,确认 == 确认。当您发送 TCP 数据包时,会发送回 ACK 数据包,让您知道数据已到达目的地。当数据发送完成时,这通常通过 Node.js 中的回调公开。但是,它可以在某处被缓冲,并且您的应用程序无法控制它。只要你在等待那个回调,你的状态就很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-29
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多