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

时间:2012-03-15 11:20:48

标签: 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);
}

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

1 个答案:

答案 0 :(得分:5)

  

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

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

  

我应该考虑使用Boost :: Asio,并使这些功能起作用   异步。但我不知道服务器如何工作。   如果有人能解释基本上这样的话,我将不胜感激   服务器工作。

您应该首先关注Boost :: Asio tutorials,并特别关注Asynchronous TCP daytime server。在了解程序流程被反转后,concept of asynchronous编程与同步编程相比并不困难。从较高的层面来看,您的游戏服务器将具有由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
}

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

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