﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-组件工厂-随笔分类-系统架构设计</title><link>http://www.cppblog.com/flashboy/category/7266.html</link><description>------3D游戏研发</description><language>zh-cn</language><lastBuildDate>Tue, 13 Jul 2010 04:03:17 GMT</lastBuildDate><pubDate>Tue, 13 Jul 2010 04:03:17 GMT</pubDate><ttl>60</ttl><item><title>MMORPG游戏服务器框架的可行性报告 (提高生产效率)</title><link>http://www.cppblog.com/flashboy/archive/2010/07/09/119837.html</link><dc:creator>RedLight</dc:creator><author>RedLight</author><pubDate>Fri, 09 Jul 2010 02:45:00 GMT</pubDate><guid>http://www.cppblog.com/flashboy/archive/2010/07/09/119837.html</guid><wfw:comment>http://www.cppblog.com/flashboy/comments/119837.html</wfw:comment><comments>http://www.cppblog.com/flashboy/archive/2010/07/09/119837.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flashboy/comments/commentRss/119837.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flashboy/services/trackbacks/119837.html</trackback:ping><description><![CDATA[纵观游戏服务器技术框架,&nbsp; 以运行在Linux操作系统上的居多, 为什么要运行在Linux上呢? 相信很多人会给出肯定的答案, Linux操作系统是开源的，而且是免费的，那叫做专业！是的，不错，是专业。但有一个问题让我们值得思考的是，虽然是免费的，但Linux工具比较贫乏，在某种程度上大大加在了开发成本及后期调试时间，所以我们不得不研究出一种代码可以运行在Linux，但又要节省开发成本，提高生产效率的可行性方案。<br><br>在Linux上，古老的Linux C程序员一般会采用一个文本编辑工具，比如：VI等，由于我以前是在windows下生活的，对VS.net这一类的工具颇为喜爱，它的开发方便快捷，又有开发辅助插件的支持，使你可以尽情使用智能提示，快捷键，代码模板等高效生产代码。可以说编码更多的是依靠可视化工具查错，快速跳转代码等。反正我的意思就是开发相当愉悦。但Linux下的C程序员则不然，我也曾经问过他们为什么要采用VI等编辑工具来编代码，首先，他们给到我的第一答案是"专业", 其实我也不太懂他们说的专业是什么，是传统意义上的，还是习惯性必须的；然后他们说：&#8220;使用makefile文件来编译代码很爽，速度很快&#8221;，这一点我是赞同的，但有个问题是程序员的入门门槛比较高，要求大家都要会这东西，还是麻烦，从HR招聘处可以看到，本来投C++程序员的人就比较少了，因为C++应用的领域基础是应用软件，游戏啊，电信啊，还是一些MFC界面性的东西，而且要求功底比较好，确实有时候招人还是挺难的，更不用说还要有Linux开发经验的人了。最后，我问了linux开发不员说那你们的调试用什么工具，他们说：&#8220;gdb&#8221;, 又是一个"手打牛肉丸"，自我感觉很痛苦，心里想&#8220;为什么有那么先进的工具，比方说：Eclipse CDT， 你们不用呢?&#8221;，其实他们心中也是有答案的，&#8220;编码要养成一种好习惯，而不是依靠于某种工具&#8221;，显然Linux程序员在编码上大体要比windows上的程序员来得严格，也感觉到他们的代码比较有质量。但很显然的，由于开发环境的布署比较麻烦，对于大规模生产是否能够每个人都有那么高素质的编程能力，那就是个"谜"！------ &#8220;猜不准!&#8221;<br><br>针对上面的情况，我也自己分析了一下，软件开发的三大要素是什么，成本，质量，进度， 只有这三项东西控制得好，那才能控制好项目。<br>那软件编程的基础是什么？ 当然是调用操作系统的API了，很显然的， 不同操作系统有不同的API，除非你有一个跨平台的开发框架，或者叫类库也行。<br>接下来软件架构在不同领域是否通用？比方说：通信框架，很显然的，还是有区别的，比方说电信系统与游戏系统，那显然还是不一样的。<br>最后，软件编码与接口(API)是不是应该更多人常用的，而且容易上手的(友好第一！)，这样才可以减少开发成本及协调工作。<br><br>总结一下，我心中已有答案了，必须采用一种大多数程序员可以接受的，而且是他们熟悉的（不要DIY的），而且开发速度快速的开发方式那才是真道理。<br>以下是我的基本方案：<br>&nbsp;
<p><span><span>一、<span>&nbsp;&nbsp; 跨平台</span></span></span><span>框架的基础设施</span><span> (</span><span>组件图</span><span>)</span></p>
<p><span><span>1.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>MySQL</span><span>数据库操作组件</span></p>
<p><span><span>2.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>线程池</span><span> </span><span>及</span><span> </span><span>读写锁</span></p>
<p><span><span>3.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>基础数据类型，容器，内存池，环形缓冲区</span></p>
<p><span><span>4.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>IOCP</span><span>及</span><span>Epoll</span><span>跨平台的面向对象通信框架</span></p>
<p><span><span>5.<span>&nbsp;&nbsp;&nbsp; </span></span></span><span>集成</span><span>LuaTinker</span><span>脚本交互模块等</span></p>
&nbsp;
<p><span><span>二、<span>&nbsp;&nbsp; </span></span></span><span>开发方式与调试环境</span></p>
<p><span>本框架的初步设想是前期在</span><span>Windows</span><span>下使用</span><span>VS.net 2008</span><span>进行开发调试，争取在</span><span>Windows</span><span>下解决</span><span>80%</span><span>左右的逻辑错误。之后由主程序员把代码移植到</span><span>Linux</span><span>，并使用</span><span>Eclipse CDT</span><span>可视化开发环境进行后期的调试工作。这样也大大降低招聘人员的知识要求</span><span>(</span><span>不用懂</span><span>Linux)</span><span>，在某一程度降低了人员成本和加快了开发效率。<br><br><br></span></p>
<img src ="http://www.cppblog.com/flashboy/aggbug/119837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flashboy/" target="_blank">RedLight</a> 2010-07-09 10:45 <a href="http://www.cppblog.com/flashboy/archive/2010/07/09/119837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MMORPG服务器组集群方案</title><link>http://www.cppblog.com/flashboy/archive/2010/07/09/119830.html</link><dc:creator>RedLight</dc:creator><author>RedLight</author><pubDate>Fri, 09 Jul 2010 02:05:00 GMT</pubDate><guid>http://www.cppblog.com/flashboy/archive/2010/07/09/119830.html</guid><wfw:comment>http://www.cppblog.com/flashboy/comments/119830.html</wfw:comment><comments>http://www.cppblog.com/flashboy/archive/2010/07/09/119830.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/flashboy/comments/commentRss/119830.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flashboy/services/trackbacks/119830.html</trackback:ping><description><![CDATA[<img src="http://www.cppblog.com/images/cppblog_com/flashboy/serverGroupDesign2.JPG" border=0><br><br><img height=726 src="http://www.cppblog.com/images/cppblog_com/flashboy/serverGroupDesign.JPG" width=720 border=0><br><br><br>&nbsp;
<p><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>LoginApp</span></p>
<p><span>即登录服务器</span><span>, </span><span>它主要完成玩家帐号的验证</span><span>, </span><span>同时它通过</span><span>BaseAppMgr</span><span>并向玩家发送一个</span><span>SessionKey</span><span>作为基础服务器</span><span>(BaseApp)</span><span>的登录密钥；同时</span><span>LoginServer</span><span>还向玩家发送服务器列表信息。</span></p>
<p><span>2. BaseApp</span></p>
<p><span>&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;</span></span><span>即基础服务器，</span><span> </span><span>也称连接服务器，它还维持着一个客户端连接列表</span><span>(</span><span>用户列表</span><span>), </span><span>这样它可以实现区域消息广播及通过</span><span>BaseAppMgr</span><span>实现世界聊天</span><span>, </span><span>玩家信息查看等功能；它还负责消息的分发到</span><span>CellApp</span><span>进行处理，并把结果返回到客户端。</span></p>
<p><span>3. CellApp</span></p>
<p><span>即游戏服务器，它负责世界数据的加载，游戏逻辑的处理及世界对象的管理。在本架构中当为支线服务器。</span></p>
<p><span>4. DBMgr</span></p>
<p><span>用户服务器，它负责用户相关数据的存取。一般是用户登录选择角色后就获得角色所有相关数据给到</span><span>MapServer, </span><span>并由</span><span>MapServer</span><span>定时保存角色的相关数据。</span></p>
<p><span>5. BaseAppMgr</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>基础服务器管理器，主要负责分配基础服务器给到客户端连接，同时它采用某种策略可以实现用户的均衡负载等。</span></p>
<p><span>6. CellAppMgr</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>支线服务器管理器</span><span>, </span><span>它主要根据支线</span><span>ID</span><span>为基础代理对象分配支线服务器实体</span><span>, </span><span>这样就可以实现与客户端的通信了。</span></p>
<p><span>7. DB</span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>数据库服务器主要分为三个库来存取，</span><span>AccountDB</span><span>为玩家账户信息，</span><span>CharacterDB</span><span>为玩家角色相关信息，</span><span>WorldDB</span><span>为所胡的世界数据。</span></p>
<img src ="http://www.cppblog.com/flashboy/aggbug/119830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flashboy/" target="_blank">RedLight</a> 2010-07-09 10:05 <a href="http://www.cppblog.com/flashboy/archive/2010/07/09/119830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>