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

Multithreading 使用Boost:Asio的游戏服务器如何异步工作?,multithreading,boost,boost-asio,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

我正在尝试创建一个游戏服务器,目前,我正在使用线程进行创建。每一个对象(玩家、怪物)都有自己的线程和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);
}
我听说使用这样的线程来创建服务器效率不高, 我应该考虑使用Booo::Asio,并使函数异步工作。 但我不知道服务器将如何工作。如果有人能解释一下这些服务器的基本工作原理,我将不胜感激

每个对象(玩家、怪物)都有自己的线程。 我听说让服务器使用线程是没有效率的 那样

你是对的,这不是一个可伸缩的设计。考虑一个大型游戏,你可以有10000个对象,甚至一百万个。当每个对象都需要线程时,这样的设计很快就会崩溃。这就是我们所知道的

我应该考虑使用Booo::Asio,使函数工作 异步的。但我不知道服务器将如何工作。 如果有人能解释一下基本情况,我将不胜感激 服务器工作

您应该从Boost::Asio开始,并特别注意。在了解到程序的流程是反向的之后,与同步编程相比,编程并不困难。从较高的层次来看,游戏服务器将有一个事件循环,该循环由一个
boost::asio::io_服务驱动。过于简化,它会像这样

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
}
从事件循环调用的回调处理程序将把操作链接在一起。也就是说,一旦调用了从客户机读取数据的回调,处理程序将启动另一个异步操作

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