Boost:Asio的游戏服务器如何异步工作?

Dai*_*vys 4 multithreading boost boost-asio

我正在尝试创建一个游戏服务器,目前,我正在使用线程.每个对象(玩家,怪物)都有自己的线程与while(1)循环,执行特定的功能.

服务器基本上是这样的:

main(){

//some initialization

while(1)
{
//reads clients packet
//directs packet info to a particular object
//object performs some functions
//then server returns result packet back to client
Sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

我听说使用这样的线程使服务器效率不高,我应该考虑使用Boost :: Asio,并使函数异步工作.但我不知道服务器如何工作.如果有人能解释这些服务器的工作原理,我将不胜感激.

Sam*_*ler 8

每个对象(玩家,怪物)都有自己的线程.我听说使用这样的线程使服务器效率不高

你是对的,这不是一个可扩展的设计.考虑一个大型游戏,你可能有10,000个对象甚至一百万个.当每个对象需要一个线程时,这样的设计很快就会崩溃.这被称为C10K问题.

我应该考虑使用Boost :: Asio,并使函数异步工作.但我不知道服务器如何工作.如果有人能解释这些服务器的工作原理,我将不胜感激.

您应该首先遵循Boost :: Asio 教程,并特别注意异步TCP日间服务器.在了解程序流程被反转之后,异步编程与同步编程相比的概念并不困难.从较高的层面来看,您的游戏服务器将具有由a驱动的事件循环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
}
Run Code Online (Sandbox Code Playgroud)

从事件循环调用的回调处理程序将操作链接在一起.也就是说,一旦调用了从客户端读取数据的回调,处理程序将启动另一个异步操作.

这种设计的优点在于它将线程与并发分离.考虑游戏服务器中的长时间运行操作,例如从客户端读取数据.使用异步方法,您的游戏服务器无需等待操作完成.代表内核完成操作时会通知它.