贸易时代的总结
大纲:
项目的历史背景
服务器的设计思路
服务器的技术
服务器的设计
服务器的改进
图形引擎myhoho及UI库的设计
客户端与服务器的集成
在04年暑假的时候,我真正的用心玩了一款网络游戏《航海世纪》,在10月的时候,学校要把毕业设计的题目交上去,就决定自己也做一款网络游戏。当时开始研究网络游戏的设计,整理出一个关于服务器结构设计文章《我的MMORPG游戏服务器端的设计》。后来的《贸易时代》的系统设计,就是按照我总结出来的方法进行设计的。而游戏里的网络消息数据包的设计思路,参考了《航海世纪》的一些东西。所以我不再详细的说写系统结构的设计,里只是大概的介绍一下,有兴趣的可以自己看我写的文章。
网络游戏一般采用C/S模式,网络游戏的设计重点,我认为在于Server端,也就是我们说的服务器。在服务器端的设计,我把服务器按照功能分为2个部分,一个负责游戏世界的处理,一个服务器服务器与客户端的通讯。在负责游戏世界的处理的服务器,我又按照功能分为地图服务器和逻辑服务器。这样划分的依据是他们处理的内容不同进行。当初的设计还考虑到系统的集群功能,可以把游戏的地图移动处理和游戏的逻辑处理都分别分摊到其它服务器里面去。但是做到最后,发现这样的设计也不是太好,主要是因为在处理一些游戏事件的时候需要两个服务器之间进行协同,这样势必要创建一定的网络游戏消息,在开始制作游戏的时候,因为需要系统的东西不是很多,所以没有太注意,到项目的后期,想增加一个功能的时候,就发现在处理船只沉没的时候,服务器需要传递很多同步数据,而且服务器各自在设置玩家数据的时候,也有很多重复的地方。如果今后还要再加点什么其它功能,那要同步的地方就实在是太多了,所以按照功能把服务器分为2个部分的设计还是存在缺陷的,如果让我重新再来,我会选择单服务器的设计,当然这个服务器还是要和连接服务器进行分离,因为游戏的逻辑处理和与玩家的通讯还是很好分开的,而且分开的话,也有利于逻辑服务器的设计。
登陆(连接)服务器的设计:
在网络游戏里,其中一个很大的难点就是玩家与服务器的通讯,在Windos的服务器架构下,网络游戏服务器端采用的I/O模型,通常是完成端口。在项目开始时研究完成端口,感觉很难,根本看不懂,因为它在很多地方与以前写网络通讯软件时用的方法不同。但是当我分析过3个完成端口的程序后,基本了解的它的使用方法。而且在懂以后,回过头来看,其它完成端口的概念也不是很复杂,只要能清楚的了解几个函数的使用方法以及基本的处理框架流程,你就会发现它其实非常的简单。
完成端口的一些需要理解的地方:
1。消息队列
2。工作线程
3。网络消息返回结构体
一般我们在设计服务器端的时候,最关键的地方是如何分辩刚刚收到的网络数据是由那个玩家发送过来的,如果是采用消息事件驱动的话,是可以得到一个socket的值,然后再用这个值与系统里存在的socket进行比对,这样就可以得到是那位玩家发送过来的游戏消息。我在还没有使用完成端口的时候,就是使用这个方法。这样的设计有一个缺点就是每次收到数据的时候回浪费很多时间在于确定消息发送者身份上。但是在完成端口的设计里,我们可以采用一个取巧的方法进行设计。所以,这个问题很轻易的就结局了,而且系统开销也不是很大,关于完成端口,可以参考一下的文章:
《关于Winsock异步I/O模型中的事件模型》
http://search.csdn.net/Expert/topic/166/166227.xml?temp=.4639093
《手把手教你玩转SOCKET模型之重叠I/O篇》
http://blog.csdn.net/piggyxp/archive/2004/09/23/114883.aspx
《学习日记]IOCP的学习--初步理解》
http://www.gameres.com/bbs/showthread.asp?threadid=25898
《用完成端口开发大响应规模的Winsock应用程序》
http://www.xiaozhou.net/ReadNews.asp?NewsID=901
《理解I/O Completion Port》
http://dev.gameres.com/Program/Control/IOCP.htm
几个关键函数的说明:
http://msdn.microsoft.com/library/en-us/fileio/fs/postqueuedcompletionstatus.asp?frame=true
http://msdn.microsoft.com/library/en-us/fileio/fs/createiocompletionport.asp?frame=true
http://msdn.microsoft.com/library/en-us/fileio/fs/getqueuedcompletionstatus.asp?frame=true
http://msdn.microsoft.com/library/en-us/winsock/winsock/wsarecv_2.asp?frame=t