[ENet-discuss] ENet performance (packet reuse/allocation, channel count...)

Lee Salzman lsalzman1 at cox.net
Mon May 1 20:44:32 PDT 2006


Unless there is some bug I am not aware of, packets are reference 
counted and can be sent as many times as you want before the call to 
enet_host_service. Just do not modify the contents of the packet.

You can specify a custom allocator by using the 
enet_initialize_with_callbacks() function instead of enet_initialize().

I would try not to create an excessive number of channels, although a 
small number shouldn't hurt. There are some parts of ENet that could be 
more scalable than they are.

Lee

Kevin Gadd wrote:
> Hey all,
> 
> I'm working on an experimental small-scale multiplayer engine that is 
> designed for fairly large (compared to a typical use of ENet, anyway) 
> client counts. Because of this, I'm going to be sending and recieving a 
> LOT of data (and packets). Currently, sending a packet to multiple peers 
> requires creating a copy of the packet for each individual peer (unless 
> I'm sending it to all my peers, and I can broadcast it). The expense of 
> all these packet allocations (and data copies) is somewhat significant. 
> In general, having to create a new packet every time I send data is 
> complicating my network code considerably. My previous performance tests 
> of sending large amounts of data via enet were not particularly 
> encouraging - it worked, mostly, but the library definitely struggled 
> under heavy load, and completely failed if I queued too many packets at 
> once (due to what, I assume, is a fixed-size queue somewhere). The limit 
> on how many packets I could queue at once meant I either had to batch 
> packets in small amounts and service my host repeatedly, or send very 
> large packets. Large packets meant lots of big copies and allocations, 
> which wasn't much of an improvement either.
> 
> Is there a way I could reuse a single packet for multiple sends, or even 
> better, create a packet without allocating a new data block for it 
> (ideally, I'd be using an existing block of memory instead)? There 
> doesn't seem to be any straightforward way of doing the latter 
> currently, but it seems like in theory the former could work with the 
> current ENet api at least (though none of the documentation actually 
> says whether or not a single packet can be sent multiple times - the 
> tutorial just says enet handles deallocating it automatically).
> 
> If there isn't any good way of solving this problem with the current 
> API, I'd like to extend ENet to support setting up a custom allocator, 
> or at least passing pre-existing data when creating a packet. Either 
> option would allow me to easily pin my existing data in memory and pass 
> it to enet, saving a considerable number of allocations and copies. If 
> this ends up being the best route to take, any suggestions on how to 
> design these changes would be appreciated - if I go to the trouble of 
> doing this, I'd like to make sure and at least make the changes in a 
> manner that allows them to be integrated into the official codebase.
> 
> On a related note, I was also wondering if there is any significant 
> performance/memory usage impact involved in setting up a connection with 
> lots of channels. Ideally I can just set up all my connections with a 
> good number of channels (16, 32, 64, whatever), and start communicating 
> on different channels as needed without breaking client/server 
> compatibility. But if unused channels have a significant impact on 
> performance I'll have to wait until I really need the channels before I 
> start using them.
> 
> In the meanwhile I'm going to keep mucking around and see what I come up 
> with, but I wanted to get some feedback from people that have more 
> experience with enet than I do.
> 
> Thanks,
> -kg
> 



More information about the ENet-discuss mailing list