[ENet-discuss] ENet package broadcasting
Boris
bstih at zootfly.com
Tue Feb 24 07:47:46 PST 2009
I must say, that ENet is a great network library.
We are working on a multiplayer based game, so we decided to use ENet
library.
To make our lives easier, we decided to use fixed time step as in Halo
games, so that we can send players inputs over network. What this means
is, that if we send same inputs over and over, we get the same results.
This is also great for replaying and debugging.
To understand what I am talking about here is a link:
http://www.flipcode.com/archives/Main_Loop_with_Fixed_Time_Steps.shtml
By using ENet, we are making peer-to-peer based network, so that every
client sends its input to others.
We do this by creating a client host with enet_host_create() function.
Ofcoarse we flag one of the clients as server, so that it manages some
of the server methods.
The following code creates client host:
void CreateClient(ENetAddress address, int server)
{
ENetHost *client = enet_host_create (& address , MAX_CONNECTIONS, 0,
0);
}
When a new client connects to our server flagged client, a respond
message is send back to that client. A message contains a list of all
clients connected to server. We tell our new client to connect to every
client from this list by using the following code:
void ClientConnect()
{
for(int a=0;a<aClientList;a++)
{
ENetAddress address = aClientList[a]->GetAddress();
ENetPeer *clientpeer = enet_host_connect( this_client , address ,
1 );
}
}
So this is how we get our peer-to-peer based network.
Because of our fixed time step, we wait every client to send its input
to every one. When data arrives, we update next frame.
But the problem is that it takes way to long for data to arrive from
client to server or vice versa.
//
To send a message we use the following code:
void SendMessage(ENetHost *client, Data data)
{
ENetPacket *pPacket = enet_packet_create( data->GetBuffer() ,
data->GetSize() , ENET_PACKET_FLAG_RELIABLE );
enet_host_broadcast( client , 0 , pPacket );
enet_host_flush( client );
}
The NetworkManager does something like in the following code:
while(!isInputBuffer())
{
numloop++;
//
if(updateinput > input_lag-1)
{
// send only once
UpdateNetworkPlayerInput(dt);
}
//
if(isServer())
pNetPeer->UpdateServer(numloop>1 ? deltadt :
dt,network_pinging->GetInt());
if(isClient())
pNetPeer->UpdateClient(numloop>1 ? deltadt :
dt,network_pinging->GetInt());
//
updateinput--;
}
// read from input buffers for dummy players
UpdateNetworkDummyInput(dt);
The isInputBuffer() function checks if there is still any input in
buffer to read from. If the input buffers are empty go to while loop and
stay in this loop until data arrived from all connected clients.
//
UpdateNetworkPlayerInput() function creates a message containing players
input. This functions calls our SendMessage() function, so that inputs
are sent to other connected clients.
UpdateClient() and UpdateServer(), these two functions call
enet_host_service() where events are processed.
while( enet_host_service( pHost , &Event , 0 ) > 0)
{
switch( Event.type ) {
case ENET_EVENT_TYPE_CONNECT:
{
//handle connected events
break;
}
case ENET_EVENT_TYPE_RECEIVE:
{
//handle receive events
OnReceive();
break;
}
.
.
.
like in tutorial.
So my question is, what could cause such big lag? The data can take even
half a second to arrive. When sending text messages, or ping messages it
appears to work properly. The data arrives with minimal delay.
The size of input data that we are sending is about 120 bytes depends on
amount of inputs pressed.
We are using latest ENet 1.22
Thank you in advance, for any further clarifications please reply.
More information about the ENet-discuss
mailing list