2-player game, client and server at localhost
Michael Rybak
accepted at ukr.net
Tue Aug 2 12:31:55 EDT 2005
CS> Michael Rybak wrote:
>> That's the problem - "or a player input comes in". As I've explained,
>> this happens a dozen of times per second :(. I've even tried not
>> checking for player's input after every frame, but do it 3 times more
>> rare (if framecount % 3 == 0 : process_players_input()). Well, I've
>> already got it that I shouldn't tie this around framerate, but
>> nevertheless...
CS> There's the key. How are you processing network input, specifically
CS> retrieving it from the socket?
A "sock" class has a socket with 0.00001 timeout, and every time I
want anything, I call it's read_command() method until it returns
anything. read_command() and send_command() transfer user's actions in
special format so that it takes 10 bytes per transfer.
I believe this should be rewritten to be done in a separate thread, and
that *current* user input should be processed as *next* one:
while 1:
render()
inp = get_player_input()
thread.start_new(send_inp, (inp,))
thread.start_new(accept_opponents_inp, ())
while still_no_opponents_input_from_previous_iteration()
time.sleep(0.05)
process_previous_player_input()
physics.make_step
I will try writing it that way, but I doubt it shall make things much
better... You see, I've tried the normal 1-server-2-clients approach
with Pyro (and today with simulating RMI proxy via UDP), and resulted
with nothing comforting. Please read the "using Pyro for network
games" topic here for details.
--
Best Regards,
Michael Rybak mailto:accepted at ukr.net
Antivirus alert: file .signature infected by signature virus.
Hi! I'm a signature virus! Copy me into your signature file to help me spread!
P.S. here's the sock class. My server_sock and client_sock are derived
from it, with additional accept_connection and establish_connection
methods respectively.
#sock.py
import socket
import com_network
import constants as c_
class sock:
def __init__(self, host):
self.host = host
self.port = c_._PORT
self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sockobj.settimeout(0.00001)
self.curcon = None #connection will be created and saved here
self.connected = False
def read_command(self):
"""format:
command_id - 1 byte
command_size - CMD_LEN_BIT_SIZE bytes
command_text - command_size bytes
returns a triple (int id, int size, str text)"""
if not self.connected:
return (None, None)
cmd = com_network.read_fixed(self.curcon, 1)
if len(cmd) < 1: #no cmd
return (None, None)
sz = com_network.read_fixed(self.curcon, CMD_LEN_BIT_SIZE)
cmd, sz = str_to_cmd(cmd + sz)
text = com_network.read_fixed(self.curcon, sz)
return (cmd, text)
def send_command(self, cmd, obj):
send_text(self.curcon, com_network.cmd_to_str(cmd, str(obj)))
def close(self):
if self.connected:
self.connected = False
self.curcon.close
self.curcon = None
self.sockobj.close()
More information about the Python-list
mailing list