我正在尝试创建一个游戏服务器,目前,我正在使用线程。每个对象(一个玩家,怪物)都有自己的线程与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,并使函数异步工作。 但我不知道服务器如何工作。如果有人能解释这些服务器的工作原理,我将不胜感激。
答案 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
}
从事件循环调用的回调处理程序将操作链接在一起。也就是说,一旦调用了从客户端读取数据的回调,处理程序将启动另一个异步操作。
这种设计的优点在于它将线程与并发分离。考虑游戏服务器中的长时间运行操作,例如从客户端读取数据。使用异步方法,您的游戏服务器无需等待操作完成。当代表内核完成操作时,它将收到通知。