I discovered a couple more bugs in the game, related to features added by me. After introducing the player IDs I run a couple tests and the IDs seemed to be correct on all the machines but, as it turns out, they weren’t. Fixed this by initializing every time a player joins the game. The host is the responsible for sending out the correct data. Another bug that happened when the host exited the game in the Lobby screen was also fixed (just another verification of the network session. The feature of joining the game in progress was also broken because of a couple initializations that were missing – fixed.
Simulate latency and packet loss
I’ve also been working in ways of collecting interesting data with this VFC implementation. I was thinking about using a XNA feature that enables the simulation of a typical Internet conditions on a LAN. By using the SimulatedLatency and SimulatedPacketLoss properties of the NetworkSession I thought would be able to simulate the desired conditions. As it turns out there are a couple of issues with these simulated properties. First, they also affect local data and the server would lose data that it sent to itself. Tried to work around it by setting this up in a per-send basis but didn’t work. Seems like it isn’t able to identify which packets are to be delayed or not. I also think that these simulation properties don’t work well with XNA’s reliable communication, I believe that even packets sent with the Reliable option get caught in the packet loss simulation (which shouldn’t since the framework itself guarantees it’s delivery).
Simulating actual conditions found in the Internet for the gameplay is a major concern. For this reason I’ve been trying to find and test different tools that simulate a WAN on a LAN. There are a couple commercial solutions that work but I’m still unable to find an open source or at least free tool that would work as expected on a windows machine. For now, I’m using a trial version of Shunra VE Desktop Standard and it looks pretty good for the purpose intended. Already tested a couple variables and the network starts to get annoying at about 200ms of latency with 10% packet loss. Still I’m yet to try other parameters for the VFC requirements so it’s possible to tolerate bigger limits on the latency and packet loss.
There are other very useful properties in the XNA framework NetworkSession: BytesPerSecondSent and BytesPerSecondReceived. Using these it’s possible to see the actual bandwidth used in each scenario of the game. Even with only two players it’s possible to see the difference when they are close or far from each other, varying from around 1.5kBps to 250B of data sent by the server. The data received by the server is constant and shouldn’t be a problem since it’s about only 1kBps for each player.
Artificial Intelligence vs Repeated Input
I’ve been trying to think about the best solution in order to test the behavior of the game with more terminals and concurrent real players. I have two approaches in mind:
Making some basic artificial intelligence that would only chose the input and send it to the host (the same way a player would do), nothing very smart is needed, just that it keeps moving and shooting around;
Or recording the input from a game and replaying it on several machines.
I believe the first alternative is the best one since it should be quite easy, given the position on the arena to choose where I want to move and shoot. It’s irrelevant whether the bots are really aiming at a target or if they are just shooting and moving around. The most important thing is that they keep moving around getting closer and further away from each other so that it is possible to observe a correct flow of the game.