我正在尝试创建一个游戏服务器,目前我正在使用线程来制作它。每个对象(玩家,怪物)都有自己的带有 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,并使函数异步工作。
但我不知道服务器将如何工作。如果有人能解释此类服务器的基本工作原理,我将不胜感激。
每个对象(玩家、怪物)都有自己的线程。
我听说让服务器使用线程效率不高
像那样
你是对的,这不是一个可扩展的设计。考虑一个大型游戏,您可能有 10,000 个甚至 100 万个对象。当每个对象需要一个线程时,这种设计很快就会崩溃。这被称为C10K问题 http://www.kegel.com/c10k.html.
我应该考虑使用 Boost::Asio,并使功能正常工作
异步地。但我不知道服务器将如何工作。
如果有人能解释一下基本上是如何这样的,我将不胜感激
服务器工作。
您应该从遵循 Boost::Asio 开始教程 http://www.boost.org/doc/libs/release/doc/html/boost_asio/tutorial.html,并特别注意异步 TCP 日间服务器 http://www.boost.org/doc/libs/release/doc/html/boost_asio/tutorial.html#boost_asio.tutorial.tutdaytime3. The 异步的概念 https://stackoverflow.com/a/5291002/283302在您了解程序流程是相反的之后,与同步编程相比,编程并不困难。从较高的层次来看,您的游戏服务器将有一个由以下事件驱动的事件循环: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
}
从事件循环调用的回调处理程序会将操作链接在一起。也就是说,一旦调用从客户端读取数据的回调,处理程序将启动另一个异步操作。
这种设计的美妙之处在于它将线程与并发分离。考虑游戏服务器中长时间运行的操作,例如从客户端读取数据。使用异步方法,您的游戏服务器不需要等待操作完成。当操作代表内核完成时,它将收到通知。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)