2013-04-28 7 views
6

Attualmente sto riscrivendo il lato server di un mmorpg molto vecchio, e stavo cercando una buona libreria di rete opensource da utilizzare con C/C++.Libreria di rete per lato server di un mmorpg (libuv/boost :: asio?)

Poiché il client esiste già, non è possibile utilizzare alcuna libreria che imponga un tipo di struttura o comunicazione a pacchetto (come, ad esempio, RakNet).

Il server utilizzerà principalmente UDP, su tre porte diverse.

Dopo aver cercato su internet, ho scoperto boost: asio e libuv.

boost :: asio sembra un'opzione matura, poiché userò già boost, ma ho letto che la loro implementazione UDP è un po 'scarsa e che non può ottenere le massime prestazioni di un processore multicore a causa di alcune serrature quando si utilizza epoll.

libuv sembra grande, è basato su eventi, supportato da un grande progetto, ma al momento non esiste un progetto di questo tipo che lo utilizza, quindi sono in dubbio per usarlo.

Cosa ne pensi? Posso usare libuv in un progetto come questo, o dovrò andare con boost :: asio? Sono aperto anche ad altri suggerimenti (devono essere multipiattaforma e ho già scartato enet, libevent e libev).

+0

[liblacewing] (http: // lacewing-project.org) potrebbe anche essere una buona soluzione per questo (supporta epoll, kqueue o IOCP su Windows). Divulgazione: sono lo sviluppatore principale. –

+0

Cool project, lo guarderò, ma sono tentato di usare asio, dato che userò già boost. – RenatoUtsch

+2

@ RenatoUtsch Ciao Renato, e un anno dopo, cosa hai scelto? Potresti darci dei ritorni sulla tua esperienza? Grazie –

risposta

4

O libuv o Boost.Asio dovrebbe andare bene. Ho osservato risultati simili tra le librerie in entrambe le applicazioni in tempo reale e quasi in tempo reale.

Se utilizzati Boost.Asio, essere a conoscenza di:

  • Come ridurre al minimo la quantità di handler memory allocation.
  • io_service il blocco può essere eliminato fornendo un concurrency_hint di 1 allo io_serviceconstructor. Tuttavia, ciò non impedirà il blocco all'interno del reattore.

Dalla mia esperienza con lo sviluppo del gioco:

  • Se le capacità di rete vengono forniti al codice del gioco sia attraverso un'interfaccia o di coda, allora è abbastanza banale per passare da una libreria basata sugli eventi a un'altra libreria basata su eventi, come Boost.Asio e libuv.
  • L'architettura del server ha un impatto molto maggiore rispetto al codice di rete stesso. Sia Boost.Asio e libuv forniscono funzionalità IPC che possono essere utili per architetture di server multi-demone.

Mentre c'è qualche sovrapposizione tra le due librerie, potrebbe essere utile leggere il confronto this.

+0

Ma se si specifica un 'concurrency_hint' su 1, io_service verrà eseguito solo su un singolo thread. Come posso quindi sfruttare il multithreading? E grazie per il confronto, ha davvero aiutato molto. – RenatoUtsch

+0

È possibile utilizzare più oggetti 'io_service'. Questo approccio è simile a libuv, poiché libuv supporta più loop di eventi, ma non supporta l'esecuzione dello stesso loop da più thread. Con Boost.Asio, se non si imposta _concurrency_hint_, più thread possono tranquillamente servire il ciclo degli eventi. –

+0

ma non impostando concurrency_hint causerà problemi di blocco con il reattore. Bene, quindi lancerò vari oggetti io_service in base al numero di core del processore. Stavo leggendo che l'implementazione UDP di asio non è molto buona, è vero? Se fa la differenza, dovrò usare la libuv, dopotutto. Ne sai qualcosa? – RenatoUtsch

1

libevent è eccellente e mi sorprende che tu l'abbia scartato. ZeroMQ è abbastanza buono ma il supporto di Windows è leggermente limitato. RabbitMQ è stato da un mio demone in SF.

Boost.asio è anche molto buono. Dato che sembra che tu sia limitato al C++, allora libevent è quello che sto usando e dovrebbe superare di molto altri titoli MMO su cui ho lavorato in termini di latenza di rete e rete reattiva, ma richiede tcp.

+0

Il problema di libevent (e libev) è che il loro supporto di Windows non è molto buono. Tranne quello, sembra davvero molto buono. Poi ho trovato libuv, che è stato creato come "rimpiazzo" per libev su node.js, sostenendo di essere più veloce e di supportare bene Windows. Sono davvero tentato di usarlo. Hai mai avuto esperienza con questo? – RenatoUtsch

+0

E inoltre, cosa intendi quando hai detto che "richiede tcp"? Non posso usare solo UDP con esso? – RenatoUtsch

+0

libevent sembra fantastico ... Lo sto usando qui da circa 2 mesi ed è molto reattivo. Il miglior supporto per libevent è tcp. Tuttavia, c'è un po 'di supporto ... non solo le cose di cui avrete bisogno come ordinare i pacchetti e tenerli in vita. IOW, dovrai implementarli come faresti con il normale udp. Inoltre, potresti divertirti a leggere questo link. http://stackoverflow.com/questions/11361208/high-performance-scalable-udp-servers –

Problemi correlati