Development Blog

Where we pretend to know how to code.


Realizations

Published: 2014-05-07

Author: Teddi

So it’s been a while since there’s been an update (and we’ve had a few requests for one). There’s two in total coming, both somewhat technical, but this one is going to be easier to digest as opposed to the one by Killermon which is full of technical wonders.

The dev team is now down to two people actively working on it. Whitefang has gotten too busy with RL  (and couldn’t inform us of this) that we’ve had to knock him off the team and Killermon has taken up the inventory responsibilities.  I don’t really enjoy having to take people off the team (especially when it’s hard to contact them and actually inform them, because leaving a message seems cruddy), but at the moment we can’t have more holdups. The good news is the Inventory will be the focus of the next blogpost (and ultimately Killermons newfound love).

For the past number of months we’ve been working on extra stability within BBase and the servers which has actually been successful. An example of this is BBuild was up over 24 hours with players actively playing on it, spamming on it and no crashes. Likewise all other servers are seeing upwards of 10k unique players before we see a reboot of the server. However it’s actually caused another problem. One we cannot actually fix (easily, if at all).

Prediction!

Prediction in multiplayer is what makes the world go round.  It smooths all that jagged action that would otherwise make multiplayer a nightmare to enjoy. Now this is all fine and dandy, apart from one thing. Lua / Source uses floating point numbers to keep track of things. Now floating points aren’t exactly bad apart from when a number gets larger, it loses accuracy. As an example -

  • 1000 + 1 = 1001
  • 1001 + 1 = 1002
  • 1002 + 1 = 1003.5
  • 1003.5 + 1 = 5
  • 1005 + 1 = 6.

Hang on, what? Even though it’s +1 we’ve got 1003.5? This is a drastic example (as this doesn’t happen until far far later), but it highlights the problem. The server and client end up generating ever so slightly different numbers and as a result the accuracy gets skewed and prediction completely falls apart. Now this means that eventually you’re going to have some stutter action that looks like lag, but actually isn’t.

So how can we fix this? Short answer is, we can’t really. Potentially we could go into all the Lua functions that utilize timing and reset them to 0 at a certain point, but anything in our code that we use to compare against time (a cooldown for example) is going to need to be made aware of this, and there’s no guarantee that would resolve it. Furthering that we don’t know how deep the problem goes. It could be the timing system that we have access to in Lua, it could be something far deeper in the Source Engine. The impact of this is huge however, meaning that for roughly every 36 hours the server has been up, it needs reloading of the map to reset everything.

Now for gamemodes like Surf and Deathrun, this isn’t a problem because they changelevel once every 30 minutes and can maintain that precision because it all gets reset. With Lobby, RP08 and Life, they’re all deeply affected by this, especially Life.  There’s nothing more irritating than having to reload the map. On the flip side, at least it does mean that unless you’re playing at x time in the morning, theoretically you shouldn’t be hit by this ever.

It’s one of those things that ultimately is “we shall have to see” how it performs and tweak it accordingly. In the meantime, some contingency code will be added to Lobby and Rp08 to see if we can alleviate the issue, but I’m not sure how well it’ll work.

 

Next blog post should be by Killermon with all the wonderful intricacies of the item / inventory system of Life. And if you dont want to wait for Life and still Roleplay, if you haven’t guessed already - RP08 is out!  (67.205.111.172:27020)

Forum Thread: http://bbservers.co.uk/forums/index.php?threads/realizations.8332/


Historical Posts