[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] Networking?



 
The python sockets library is probably *not* the place to start.  It is very primitive,
and most references you will read will recommend using a  higher level library such as
asyncore or (higher yet) asynchat.  Unfortunately, these higher level libraries share the
same weakness as Twisted, in that that they expect to own the main loop.
 
I have identified five general approaches to integrating networking with a
pygame application.  I have not fully implemented a game with any of them, .. but soon.
 
1)  Use Twisted with reactor.iterate .  This is the easiest approach, and the one that
Mr Wittber's library uses.  Use of reactor.iterate is unfortunately deprecated by the Twisted
developers, and will, presumably, be removed from Twisted in some future release.
 
2) Use the Twisted reactor *as* your main loop, and implement all game logic as call-backs from
there.  This is the approach that the Twisted people will recommend.   This approach
is quite burdensome, in that structuring your game into a series of callbacks can be difficult.  Using
generators as coroutines provides some relief, in that you can pass the generators 'next' method
as a callback to Twisted, and maintain game state within the generator.  Using subroutines or
nested generators involve their own awkwardnesses.
 
3) Run the Twisted reactor in its own thread, and use ThreadedSelectReactor to move
data to the pygame event queue.  Bob Ippolito has blogged on how to use this with Pygame (GIYF).
Unfortunately, ThreadedSelectReactor is unmaintained and deprecated.
 
4)  Run the Twisted reactor in its own thread, and use thread-safe queues to move data
to and from the main thread.  Alternatively, if you wish to use the perspective-broker
features or use Twisted code beyond mere message passing, there are tools in Twisted for
safely invoking methods in other threads.  Hmm. maybe these were deprecated with the TSR?
 
5)  Run the Twisted reactor in its own process, and use pipes or sockets to pass data between
it and the main loop/process.  This has the merit of using the OS's CPU allocation management 
rather than that of Python's thread manager.
 
Most of these approaches could use asyncore/asynchat as an alternative to Twisted.
 
My own efforts lately have been along approaches 2 and 5.   My engine 'Spyre' will run under
Twisted's reactor now, but the getting the whole multi-engine game logic sequence working in
the 'inside-out' callback style is an imposing prospect. 
 
Philip Hassey has recently released a networked pygame-based game.  Has he mentioned what
networking approach he used?
 
David
 
On 11/19/07, Jason Ward <nyad55@xxxxxxxxx> wrote:
I want to make my game playable over the network and if possible the internet.
For the network it must support more than 2 computers and be realtime
Would the sockets library in python solve all my needs?



--
dkeeney@xxxxxxxxxxxxxxxx
Pitcher's Duel -> pitchersduel.python-hosting.com