Tonight, I continue my investigation into latency in faye. This latency manifests itself in my (fab) game collisions:
On my screen, the reaction to a collision is much faster than on the screens of other players. I tried shifting code about to resolve the issue, without luck.
I will use the node-repl to investigate tonight. I establish a faye subscription to a "/test" channel and then send a message on that same channel. When the message is received, I store the time and when the message is sent, I record the time. The difference should be the latency built-in:
node> var faye = require("faye");Hunh? The variable
node> var client = new faye.Client('http://localhost:4011/faye');
node> var d1, d2;
node> var s = client.subscribe('/test', function(message) {puts(message); d2 = new Date()});
node> client.publish('/test', 'test'); d1 = new Date();
Sat, 14 Aug 2010 08:47:39 GMT
node> d2
d2
, declared with global scope, should have been set when the subscribed channel received the message. In fact, the puts()
statement inside the subscription function proves that the message was received. What gives? Trying this in a more generic setting, I find that function scope is not able to affect a variable declared outside of it:
node> var foo = "bar";That same code works as I expect in the browser:
node> function fn() { foo = "foo"; }
node> foo
'bar'
node> fn();
node> foo
'bar'
Dang, looks like different global variable semantics in node-repl. Luckily, a global object will work in node-repl:
node> var faye = require("faye");After that, I have both
node> var client = new faye.Client('http://localhost:4011/faye');
node> var dates={};
node> var s = client.subscribe('/test', function(message) {dates['received'] = new Date()});
node> client.publish('/test', 'test'); dates['sent'] = new Date();
Sat, 14 Aug 2010 08:58:39 GMT
sent
and received
attributes in my global object:node> datesThose are date values, not strings, so I can do simple arithmetic on them to see how long it takes for the round trip message:
{ sent: Sat, 14 Aug 2010 08:58:39 GMT
, received: Sat, 14 Aug 2010 08:58:40 GMT
}
node> dates['received'] - dates['sent']Hmmm... 200 milliseconds. That might account for the delay that I am seeing. To make sure that is not a one time only thing, I run the numbers a few more times:
217
node> client.publish('/test', 'test'); dates['sent'] = new Date();Yup. That's consistently 200+ milliseconds. And that is just on my local machine. What is going to happen when this is happening over Internet connections? I thought I might have to deal with this back when I was passing messages over comet. Now I cannot avoid it if I am going to continue pursuing faye message passing.
Sat, 14 Aug 2010 08:59:27 GMT
node> dates['received'] - dates['sent']
215
node> client.publish('/test', 'test'); dates['sent'] = new Date();
Sat, 14 Aug 2010 08:59:30 GMT
node> dates['received'] - dates['sent']
212
node> client.publish('/test', 'test'); dates['sent'] = new Date();
Sat, 14 Aug 2010 08:59:35 GMT
node> dates['received'] - dates['sent']
211
node> client.publish('/test', 'test'); dates['sent'] = new Date();
Sat, 14 Aug 2010 08:59:40 GMT
node> dates['received'] - dates['sent']
212
node> client.publish('/test', 'test'); dates['sent'] = new Date();
Sat, 14 Aug 2010 08:59:43 GMT
node> dates['received'] - dates['sent']
212
And I will get started on mitigating this problem tomorrow.
Day #195
No comments:
Post a Comment