javascript - 通过 WebSockets 发送位置更新的正确方法是什么?

标签 javascript node.js networking websocket socket.io

我需要在使用 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?还是别的什么办法?处理这个问题的正确方法是什么?

最佳答案

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

为什么不把position的变化写到一个buffer里,然后用Underscore.js的throttling。您可以调用 update() 或其他任何方式,它会一次性写入整个更改缓冲区。您可以根据需要多次调用该函数,但请使用节流版本,使其实际上最多每 50 毫秒左右运行一次。

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

关于javascript - 通过 WebSockets 发送位置更新的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22310497/

相关文章:

javascript - setInterval() 如何影响性能?

javascript - AngularJS - Uncaught ReferenceError : a is not defined

jquery - 如何在node.js中使用jquery?

Linux 端口被阻止 - 该站点无法访问,拒绝连接

php - 关于使用 PHP 和 MySQL 创建社交网络的教程?

android - 在 Android 中检测有限的网络连接?

javascript - 使用下划线函数初始化变量时,最好对数组使用 .slice(0) ,对对象使用 _(obj).clone 吗?

javascript - 从 chrome.storage 顺序检索多个项目

javascript - 如何修复 "Uncaught ReferenceError: firebase is not defined"错误?

javascript - 错误: Can't set headers after they are sent