The real question is why updating some state would kill the frame-rate ?
It's a matter of design, but you will need threads, for several reasons:
- you want a constant frame-rate, this means a thread dedicated to display, most of the work should be done by the graphic card nowadays, but still
- you want to be reactive to input/output, that's another thread, indeed most IO require a dedicated thread: you can pair keyboard + mouse in one, but you'll need two for networking (one to send, one to receive)
- you'll want a number of threads (at least one) to do the heavy crunching: updating status, etc...
- finally, you'll probably have some thread to rule them all (not a ring, a thread), which will be in charge of queuing and dispatching events
It's not much different from the Model-View-Controller model when you think about it, you just add some other components to for input/output
Typically, this runs like this:
- User clicks on mouse, the mouse-listener thread generates an event (MouseClicked at such position)
- The Controller thread receives the event and send it to a "Model" thread, which will update the state of the game (start an action, etc...) if it's a long action, it would be better if it were sent to a dedicated thread (that's where the idea of pool of threads kicks in)
- The View thread is in charge of displays, and periodically changes the buffer to be displayed, it acts independently from the computations being run in the background, though you'll need some synchronization (locks) if you wish it to see a consistent state and not a partially updated state
I would add that's it's extremely complicated to get right (and there are several ways). If you add too many threads you'll just have the machine crumble under your feet, there are possibilites of deadlock, livelock, starvation etc...
If you wish to accomplish something soon, get a framework: Ogre is a good open source graphics library for example. There are resources on game programming on SO otherwise.