mirror of
https://github.com/godotengine/godot
synced 2024-09-05 10:48:25 +00:00
Use 2 different ENet channels for reliable/unreliable packets
This avoids stalling other sequenced but unreliable packets (i.e. UNRELIABLE_ORDERED) when sending RELIABLE packets.
This commit is contained in:
parent
cb7661df94
commit
8b9e5453a5
|
@ -32,7 +32,7 @@ Error NetworkedMultiplayerENet::create_server(int p_port, int p_max_clients, int
|
|||
|
||||
host = enet_host_create (& address /* the address to bind the server host to */,
|
||||
p_max_clients /* allow up to 32 clients and/or outgoing connections */,
|
||||
2 /* allow up to 2 channels to be used, 0 and 1 */,
|
||||
SYSCH_MAX /* allow up to SYSCH_MAX channels to be used */,
|
||||
p_in_bandwidth /* assume any amount of incoming bandwidth */,
|
||||
p_out_bandwidth /* assume any amount of outgoing bandwidth */);
|
||||
|
||||
|
@ -52,7 +52,7 @@ Error NetworkedMultiplayerENet::create_client(const IP_Address& p_ip, int p_port
|
|||
|
||||
host = enet_host_create (NULL /* create a client host */,
|
||||
1 /* only allow 1 outgoing connection */,
|
||||
2 /* allow up 2 channels to be used, 0 and 1 */,
|
||||
SYSCH_MAX /* allow up to SYSCH_MAX channels to be used */,
|
||||
p_in_bandwidth /* 56K modem with 56 Kbps downstream bandwidth */,
|
||||
p_out_bandwidth /* 56K modem with 14 Kbps upstream bandwidth */);
|
||||
|
||||
|
@ -70,8 +70,8 @@ Error NetworkedMultiplayerENet::create_client(const IP_Address& p_ip, int p_port
|
|||
|
||||
unique_id=_gen_unique_id();
|
||||
|
||||
/* Initiate the connection, allocating the two channels 0 and 1. */
|
||||
ENetPeer *peer = enet_host_connect (host, & address, 2, unique_id);
|
||||
/* Initiate the connection, allocating the enough channels */
|
||||
ENetPeer *peer = enet_host_connect (host, & address, SYSCH_MAX, unique_id);
|
||||
|
||||
if (peer == NULL) {
|
||||
enet_host_destroy(host);
|
||||
|
@ -148,12 +148,12 @@ void NetworkedMultiplayerENet::poll(){
|
|||
ENetPacket * packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE);
|
||||
encode_uint32(SYSMSG_ADD_PEER,&packet->data[0]);
|
||||
encode_uint32(E->key(),&packet->data[4]);
|
||||
enet_peer_send(event.peer,1,packet);
|
||||
enet_peer_send(event.peer,SYSCH_CONFIG,packet);
|
||||
//send the new peer to existing peers
|
||||
packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE);
|
||||
encode_uint32(SYSMSG_ADD_PEER,&packet->data[0]);
|
||||
encode_uint32(*new_id,&packet->data[4]);
|
||||
enet_peer_send(E->get(),1,packet);
|
||||
enet_peer_send(E->get(),SYSCH_CONFIG,packet);
|
||||
}
|
||||
} else {
|
||||
|
||||
|
@ -185,7 +185,7 @@ void NetworkedMultiplayerENet::poll(){
|
|||
ENetPacket* packet = enet_packet_create (NULL,8,ENET_PACKET_FLAG_RELIABLE);
|
||||
encode_uint32(SYSMSG_REMOVE_PEER,&packet->data[0]);
|
||||
encode_uint32(*id,&packet->data[4]);
|
||||
enet_peer_send(E->get(),1,packet);
|
||||
enet_peer_send(E->get(),SYSCH_CONFIG,packet);
|
||||
}
|
||||
} else if (!server) {
|
||||
emit_signal("server_disconnected");
|
||||
|
@ -204,7 +204,7 @@ void NetworkedMultiplayerENet::poll(){
|
|||
case ENET_EVENT_TYPE_RECEIVE: {
|
||||
|
||||
|
||||
if (event.channelID==1) {
|
||||
if (event.channelID==SYSCH_CONFIG) {
|
||||
//some config message
|
||||
ERR_CONTINUE( event.packet->dataLength < 8);
|
||||
|
||||
|
@ -226,7 +226,7 @@ void NetworkedMultiplayerENet::poll(){
|
|||
}
|
||||
|
||||
enet_packet_destroy(event.packet);
|
||||
} else if (event.channelID==0){
|
||||
} else if (event.channelID < SYSCH_MAX){
|
||||
|
||||
Packet packet;
|
||||
packet.packet = event.packet;
|
||||
|
@ -258,7 +258,7 @@ void NetworkedMultiplayerENet::poll(){
|
|||
|
||||
ENetPacket* packet2 = enet_packet_create (packet.packet->data,packet.packet->dataLength,flags);
|
||||
|
||||
enet_peer_send(E->get(),0,packet2);
|
||||
enet_peer_send(E->get(),event.channelID,packet2);
|
||||
}
|
||||
|
||||
} else if (target<0) {
|
||||
|
@ -272,7 +272,7 @@ void NetworkedMultiplayerENet::poll(){
|
|||
|
||||
ENetPacket* packet2 = enet_packet_create (packet.packet->data,packet.packet->dataLength,flags);
|
||||
|
||||
enet_peer_send(E->get(),0,packet2);
|
||||
enet_peer_send(E->get(),event.channelID,packet2);
|
||||
}
|
||||
|
||||
if (-target != 1) {
|
||||
|
@ -289,7 +289,7 @@ void NetworkedMultiplayerENet::poll(){
|
|||
} else {
|
||||
//to someone else, specifically
|
||||
ERR_CONTINUE(!peer_map.has(target));
|
||||
enet_peer_send(peer_map[target],0,packet.packet);
|
||||
enet_peer_send(peer_map[target],event.channelID,packet.packet);
|
||||
}
|
||||
} else {
|
||||
|
||||
|
@ -369,16 +369,20 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer,int p_buffer_
|
|||
ERR_FAIL_COND_V(connection_status!=CONNECTION_CONNECTED,ERR_UNCONFIGURED);
|
||||
|
||||
int packet_flags=0;
|
||||
int channel=SYSCH_RELIABLE;
|
||||
|
||||
switch(transfer_mode) {
|
||||
case TRANSFER_MODE_UNRELIABLE: {
|
||||
packet_flags=ENET_PACKET_FLAG_UNSEQUENCED;
|
||||
channel=SYSCH_UNRELIABLE;
|
||||
} break;
|
||||
case TRANSFER_MODE_UNRELIABLE_ORDERED: {
|
||||
packet_flags=0;
|
||||
channel=SYSCH_UNRELIABLE;
|
||||
} break;
|
||||
case TRANSFER_MODE_RELIABLE: {
|
||||
packet_flags=ENET_PACKET_FLAG_RELIABLE;
|
||||
channel=SYSCH_RELIABLE;
|
||||
} break;
|
||||
}
|
||||
|
||||
|
@ -402,7 +406,7 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer,int p_buffer_
|
|||
if (server) {
|
||||
|
||||
if (target_peer==0) {
|
||||
enet_host_broadcast(host,0,packet);
|
||||
enet_host_broadcast(host,channel,packet);
|
||||
} else if (target_peer<0) {
|
||||
//send to all but one
|
||||
//and make copies for sending
|
||||
|
@ -416,18 +420,18 @@ Error NetworkedMultiplayerENet::put_packet(const uint8_t *p_buffer,int p_buffer_
|
|||
|
||||
ENetPacket* packet2 = enet_packet_create (packet->data,packet->dataLength,packet_flags);
|
||||
|
||||
enet_peer_send(F->get(),0,packet2);
|
||||
enet_peer_send(F->get(),channel,packet2);
|
||||
}
|
||||
|
||||
enet_packet_destroy(packet); //original packet no longer needed
|
||||
} else {
|
||||
enet_peer_send (E->get(), 0, packet);
|
||||
enet_peer_send (E->get(), channel, packet);
|
||||
|
||||
}
|
||||
} else {
|
||||
|
||||
ERR_FAIL_COND_V(!peer_map.has(1),ERR_BUG);
|
||||
enet_peer_send (peer_map[1], 0, packet); //send to server for broadcast..
|
||||
enet_peer_send (peer_map[1], channel, packet); //send to server for broadcast..
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,13 @@ private:
|
|||
SYSMSG_REMOVE_PEER
|
||||
};
|
||||
|
||||
enum {
|
||||
SYSCH_CONFIG,
|
||||
SYSCH_RELIABLE,
|
||||
SYSCH_UNRELIABLE,
|
||||
SYSCH_MAX
|
||||
};
|
||||
|
||||
bool active;
|
||||
bool server;
|
||||
|
||||
|
|
Loading…
Reference in a new issue