Каждый объект (игрок, монстр) имеет свою нить.
Я слышал, что неэффективно, чтобы сервер использовал потоки
вот так
Вы правы, это не масштабируемый дизайн. Рассмотрим большую игру, в которой у вас может быть 10 000 объектов или даже миллион. Такой дизайн быстро разваливается, когда вам нужен поток на объект. Это известно как C10K проблема .
Я должен рассмотреть возможность использования Boost :: Asio и заставить функции работать
асинхронно. Но я не знаю, как тогда будет работать сервер.
Я был бы признателен, если бы кто-то объяснил, как в основном такие
серверы работают.
Вы должны начать, следуя учебным пособиям Boost :: Asio , и обратить особое внимание на Асинхронный TCP дневной сервер . Концепция асинхронного программирования по сравнению с синхронным программированием несложна после того, как вы поймете, что поток вашей программы инвертирован. На высоком уровне ваш игровой сервер будет иметь цикл обработки событий, управляемый boost::asio::io_service
. Слишком упрощенно, это будет выглядеть так
int
main()
{
boost::asio::io_service io_service;
// add some work to the io_service
io_service.run(); // start event loop
// should never get here
}
Обработчики обратного вызова, которые вызываются из цикла событий, объединяют операции вместе. То есть, как только ваш обратный вызов для чтения данных из клиента вызывается, обработчик инициирует другую асинхронную операцию.
Прелесть этого дизайна в том, что он отделяет потоки от параллелизма. Рассмотрим длительную операцию на игровом сервере, например, чтение данных с клиента. Используя асинхронные методы, вашему игровому серверу не нужно ждать завершения операции. Он будет уведомлен о завершении операции от имени ядра.