【问题标题】:How game servers with Boost:Asio work asynchronously?Boost:Asio 的游戏服务器如何异步工作?
【发布时间】:2012-03-15 11:20:48
【问题描述】:

我正在尝试创建一个游戏服务器,目前我正在使用线程制作它。每个对象(玩家、怪物)都有自己的带有 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,并使函数异步工作。 但我不知道服务器将如何工作。如果有人能解释这种服务器的基本工作原理,我将不胜感激。

【问题讨论】:

    标签: multithreading boost boost-asio


    【解决方案1】:

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

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

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

    您应该首先关注 Boost::Asio tutorials,并特别注意 Asynchronous TCP daytime serverconcept 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
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多