??xml version="1.0" encoding="utf-8" standalone="yes"?>色综合久久中文字幕综合网,久久久这里只有精品加勒比,国产精品久久网http://www.shnenglu.com/Husiwa/zh-cnTue, 06 May 2025 23:42:53 GMTTue, 06 May 2025 23:42:53 GMT60辩证的看一?/title><link>http://www.shnenglu.com/Husiwa/archive/2011/11/06/159702.html</link><dc:creator>IT菜鸟</dc:creator><author>IT菜鸟</author><pubDate>Sun, 06 Nov 2011 03:31:00 GMT</pubDate><guid>http://www.shnenglu.com/Husiwa/archive/2011/11/06/159702.html</guid><wfw:comment>http://www.shnenglu.com/Husiwa/comments/159702.html</wfw:comment><comments>http://www.shnenglu.com/Husiwa/archive/2011/11/06/159702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Husiwa/comments/commentRss/159702.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Husiwa/services/trackbacks/159702.html</trackback:ping><description><![CDATA[<span id="okgo8e6" class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; widows: 2; orphans: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span id="auu8kqi" class="Apple-style-span" style="font-size: 13px; line-height: 18px; font-family: 宋体, Arial, Verdana, sans-serif; border-collapse: collapse; webkit-border-horizontal-spacing: 2px; webkit-border-vertical-spacing: 2px">首先声明Q忙Q保证持l更C保证l束旉Q估计一周左叛_完,忙的话两周。涉及到对创新工场、李开复h品、移动互联网{的看法代表我魏康的个人看法,版权所有,转蝲请务必注明?span class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">大纲Q?/strong><span id="c8ouo8w" class="Apple-converted-space"> </span><br />一、缘由、概q?span class="Apple-converted-space"> </span><br />二、创新工场的模式<span id="88qkias" class="Apple-converted-space"> </span><br />三、职业发展道路的影响因素<span id="86wyi44" class="Apple-converted-space"> </span><br />四、职业选择的几个小问题<span id="i4sm8cc" class="Apple-converted-space"> </span><br />五、李开复的Ud互联|和我眼中的Ud互联|?span class="Apple-converted-space"> </span><br />六、再见和福<span id="qoqeoka" class="Apple-converted-space"> </span><br />  <br /><font size="2"><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">一、缘?/strong></font><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">、概q?/strong><span id="yk8e8s4" class="Apple-converted-space"> </span><br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">1、缘?/strong>    <span id="wcgsgqg" class="Apple-converted-space"> </span><br />     前两周,有个师弟咨询我个offer选择——360产品l理offer和创新工场某团队产品l理。他说面试的时候,创新工场某面试官说在360做品经理不如在创新工场Q?60那边产品团队XX不专业,创新工场q边产品团队XX牛BQ劝说这人推?60的offer接创新工场的offer?span class="Apple-converted-space"> </span><br />     我当时听了那叫一个汗?#8212;—能说栯的h要么特别无知要么特别无者R别的不_冲360可以监控C|民上网习惯q点也该?60ѝ何况,360产品l理做出的品有多少人用Q你创新工场有多h用?span class="Apple-converted-space"> </span><br />    最q估计是创新工场开始发offer了,不断有h咨询我这家公司,加上有些人咨询我另外的offer比较问题。我本来是懒得写长文的,只是最q看到李开复的一些过于XX的言论,再加上前几天听说了创新工场忽悠师弟师妹们{而说一些极唐的理由Q实在看不下了?span class="Apple-converted-space"> </span><br />     soQ写一吧?nbsp;   <span id="6keqaqy" class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">2、概q?/strong><span id="4y4iom4" class="Apple-converted-space"> </span><br />     我ƈ不是反对大家d新工场, 如果你生下来是做老板的(不是自认为,而是你在学校的时候已l有不少成功的创业经验)Q而且你很聪明Q很勤奋Qh格没啥短板,你可以考虑去,也只有这Uh在创新工场才有前途,创新工场也只适合q种人?span class="Apple-converted-space"> </span><br />     如果你以后的职业目标是个行业专家或者是企业中高U管理层Q那么你q是老老实实找个发展较速的企业卖命q着。现在互联网发展q么快,你去搜狗?60的核心部门,乃至团、去哪儿、开心等未来成功的概率都比去创新工场大?span class="Apple-converted-space"> </span><br />     如果你的职业目标是赚的差不多p了,比其他hZ些,别太累,收入中上Q那你找个百度、腾讯等成熟部门安安心心做个Z钉就可以了?span class="Apple-converted-space"> </span><br />  <br />     对于普通hQ什么时候时候适合d新工场?扑֮习的时候,正式工作q是了?span class="Apple-converted-space"> </span><br />     我写q片文章Q只是想告诉大家Q创新工场模式的q{思\Q学生加入会有哪些风险,你该如何选择一个offerQ移动互联网的沫。如果最后有_֊写写offer的比较吧?span class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">二、创新工场的模式Q学生加入的问题、学生创?/strong><span id="yuqquis" class="Apple-converted-space"> </span><br />Q在看之前,请先M解一?#8220;天投资?#8221;?#8220;A?#8221;?#8220;B?#8221;的大概意思,了解一下天使投资的成功率,了解一下红杉树{大型VC A、B轮的成功率)<span id="sqaumuk" class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">1、创新工场的模式</strong><span id="8a8yiqw" class="Apple-converted-space"> </span><br />a.VC的模?span class="Apple-converted-space"> </span><br />     U杉树、经U投资等知名VCQ他们一般是在企业有一定的规模Q有较ؓ清晰的盈利模式的时候才q入Q用较高的钱换取较低的股份和较高的成功率?span class="Apple-converted-space"> </span><br />    而天使投资,是在产品刚有个雏形,甚至只有个idea的时候进入,用较的钱换取较高的股䆾Q承担非帔R的失败率Q单个项目一旦成功会有很高的收益率?span class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">b.天投资者创新工场的优势</strong><span id="8i4w8c4" class="Apple-converted-space"> </span><br />天投资的收?目?#215;成功?#215;投资回报?#8212;目?#215;q_目成本<span id="4864csi" class="Apple-converted-space"> </span><br />大家可以看到Q这个模式的关键点在于:<span id="8s4uwea" class="Apple-converted-space"> </span><br />Q?Q、项目多Q?span class="Apple-converted-space"> </span><br />    天投资人,投的目成功概率都很低,李开复也l对不会例外。项目差不多靠谱׃Q创新工场拼的就是量Q?span class="Apple-converted-space"> </span><br />Q?Q、^均成本低Q?span class="Apple-converted-space"> </span><br />    IT团队初期的成本主要是人员、硬件投入、场C及行ѝ法律开支等?span class="Apple-converted-space"> </span><br />    人员Q都创业了,你要什么高工资Q给你期权忽悠一下就行?span class="Apple-converted-space"> </span><br />    g、带宽、场地、行政:q块创新工场集约化了Qh多Q项目越多,q块成本低?span class="Apple-converted-space"> </span><br />  <br />    看到上述模式了?说白了,最关键的就是要量大Q至于成功率差不多就行。米聊、UC做那么大Q都快被qq攑ր了Q目前创新工场投的这些项目有什么好虑的?<span id="a8eo4c4" class="Apple-converted-space"> </span><br />  <br />    而李开复在做量q方面拥有着独特的杠杆,他的主要受众是——学生和入世不q资源匮乏者。这批h是最需要天使投资h的,q批Z是最Ҏ被忽悠加入创业团队的。因此,他能够帮助:投资决项目数量问题,帮助创业者的老板解决掉招聘问题(招聘问题一般是初创团队面的最大问题)?span class="Apple-converted-space"> </span><br />    因此Q目前就天投资的规模来_创新工场是最大的。这也是Z么李开复的微博一说话QVC们都出来捧场Q因Z手里目多,VC都等着A、B轮的时候跟q的。你q会发现Q互联网大{们相互之间的互动不算,但是鲜有转发、评论李开复的微博Q因为大家就都知道他放屁,但跟李开复也没仇Q李开复PR做的又那么好Q惹他干吗?但是如果转了伤自qRP也不好?span class="Apple-converted-space"> </span><br />  <span id="cs8gq4g" class="Apple-converted-space"> </span><br />  <br />     soQ创新工事,本来也没啥特别的Q就是一个大型天使投资机构投资了一大批初创团队。这些创业团队再闪亮Q也是一堆初创团队,跟其它创业团队一P有很多问题,也会有一些机会,也存在很大的风险。但是由于某人的影响力,加上最q移动互联网的沫,收益被无限地攑֤了,风险看v来被~小了?span class="Apple-converted-space"> </span><br />     李开复在招聘的时候到处去忽悠Q其实也没啥Q哪个公司招人的时候不到处忽悠呢?否则开什么宣讲会Q只不过开复同志到处对没有辨别能力的学生去忽悠加入创新工场Z大大、回报高高、风险低低,q实在有Ҏ心h?span class="Apple-converted-space"> </span><br />    对于投资人、创业的老板来说Q创新工Z错,投资回报率高Q但是对于员工来_风险高收益低Q远逊于加入其它公司。一功成万骨枯Q??q过后,李开复成功的时候,谁会记得q些无辜的应届生呢?<span id="os84ec4" class="Apple-converted-space"> </span><br />  <br />下面我说一下加入这样团队的风险?span class="Apple-converted-space"> </span><br />———————————————————————————————————————<span id="88ueymu" class="Apple-converted-space"> </span><br />未完Q明后天争取 l箋二更?span class="Apple-converted-space"> </span><br />  <br />20111103日二?#8212;———————————————————————————————————————————————<span id="ycu8uai" class="Apple-converted-space"> </span><br />  <br /><font size="4"><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">三、职业发展道路的影响因素</strong></font><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none"></strong><span id="8gm4g4c" class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">1、职业规划基本理?/strong><span id="8w6e84w" class="Apple-converted-space"> </span><br />    先讲两个基本的理论:<span id="ic8aw4u" class="Apple-converted-space"> </span><br />    我自创了一套评价h的体p,大概的意思就是h可以分ؓ四个l度去观察,人格、能力、知识、其它方面(如h际关pȝ{)?span class="Apple-converted-space"> </span><br />    我也自己在摸索一些职业规划的理论Q还没完全定型,初步地讲Q做职业规划是从Q行业、职业、公司、地点等l度d析?span class="Apple-converted-space"> </span><br />    所谓的职业规划Q就是选择合适的行业、职业、公司等Q帮助自׃最大的概率快速地获得职业的高炏V至于如何才能取得职业规划效益的最大化Q话题太大,׃讲了Q只讲讲“Ch入职?#8221;?#8220;Z么不是创新工?#8221;?span class="Apple-converted-space"> </span><br />  <span id="quwgqww" class="Apple-converted-space"> </span><br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">2、职业发展的两条道\</strong><span id="oc44gy8" class="Apple-converted-space"> </span><br />    李开复光说加入创新工场比加入癑ֺ、腾讯成功概率高Q但是怎么个高法、怎么个锻炼法Q没说。我也一直蛮好奇的,如何能让一个h在创新工场成功概率比在百度、腾讯高Q我觉得李开复如果能做到Q作为百度、腾讯的股东Q我会申请发赯东会投票Q呼吁李彦宏、化腾下课让贤?span class="Apple-converted-space"> </span><br />    在没看到l果之前Q我们还是先理论分析一下,单从职业发展角度Q如何才能更为成功。做猎头q么多年了,我也大概琢磨出来?#8212;—人的最l发展结果无非两U,业务专家 or 理?<span id="cw8m8mw" class="Apple-converted-space"> </span><br />     q个跟你是否要创业还是打工无养I你是腾讯的创始h、百度的部门l理、创新工场的目负责人,你承担的也还是这两类角色。因此,你找工作Q要扄是能帮助你在未来几q内成ؓq类角色的公司、职位,只要一个公司能帮助你成Z内的专家、管理层Q咱可以坐下来谈offer。管你这家公司是癑ֺ、腾讯还是国务院?span class="Apple-converted-space"> </span><br />  <br />     理层需要的东西我们׃谈了Q谈q个对于应届生太扯E了。如果有教会一个应届生如何快速成为高U管理层Q我觉得只在一U场合里面有——做传销的,热衷l你讲如何在1?q内快速成功,快速当上家?span class="Apple-converted-space"> </span><br />     我认为想做管理层Q没啥捷径,先成Z们小l的组长再说。见q提拔业l好的当l长的,没见q提拔业l差的当l长的公司,soQ如何当理层这事,你可以工??q升了组长后去职场版再讨论?span class="Apple-converted-space"> </span><br />    soQ新人的你,W一步是得研I如何成为小l内的专家?span class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">3、如何能快速当上专?/strong><span id="8q484og" class="Apple-converted-space"> </span><br />    l合如何成ؓ一个行业知名专家或者公司内的专家这个目标,我们来分析一下职业规划跟求职者自w情늚匚w。行业就不分析了Q这话题太大了,最多过两天写写Ud互联|的情况?span class="Apple-converted-space"> </span><br />  <br />Q?Q职业和人格Q职业{换的高昂成本<span id="8cy4w84" class="Apple-converted-space"> </span><br />    xZӞ首先应该看自q人格适合什么职业,做自׃适合做的事情Q肯定成不了专家。这个职业不应该是入职后dU尝试,工作后{行的成本太高。要知道Q你再蟩槽的时候,招聘方只对专家和理层的人感兴趣Q对于想换职业方向的Z来不会感兴趣Q谁有兴招个目前做q营的过来写代码Qor招个写C++的过来做产品Q?span class="Apple-converted-space"> </span><br />    转职业的成本非常高昂Q因此尝试各U职业、各个方向应该是在你做实习的时候,q也是我Z么说创新工场非常适合d习的原因Q太合适了Q团队小Q不谈做的专业否Q但是每个h都得q好几块事情Q各个职位都有机会接触到?span class="Apple-converted-space"> </span><br />  <br />Q?Q当专家需要啥Q?nbsp; <span id="c4qam44" class="Apple-converted-space"> </span><br />    当专安要啥Q主要是两块Q职业相关的能力Q如沟通、逻辑、学习等Q业务相关知识,如XX开发语a、某工具掌握{,那么如何能快速提升能力、构建知识体p?<span id="auisuki" class="Apple-converted-space"> </span><br />    国内没啥成熟的理论,国际的我也没看到Q我自己个h认ؓ以下一些因素是必要的:良好的职业习惯、科学的学习工作Ҏ思\、有大牛带你、少走弯路。理论粗p,q请大家补充?span class="Apple-converted-space"> </span><br />    <span id="8864mmc" class="Apple-converted-space"> </span><br />Q?Q职业习?nbsp;   <br />    职业习惯Q大公司或者稍微正规的公司Q都会有各项程文档、规章制度,或者有人带你教你。这非常有助于养成良好的职业习惯Q常规事情处理流E、团队协作流E、邮件、文档写作规范、程序开发规范、开会制度,甚至如outlook、office的用。这些职业习惯的LQ可以很好地提高你的做事效率Q提高你跟公司的协同效率Q提高大家做事情的成功率?span class="Apple-converted-space"> </span><br />     我就举个例子,我们公司是小公司Q但是我们会对员工windows、office的几十个快捷键做考试Q考试不过的,要求全键盘不用鼠标干zM天。这些快捷键的掌握可以让一个经常处理文档的员工每天节约20分钟Q一q就?20个小Ӟ相当?5个工作日?span class="Apple-converted-space"> </span><br />    对于普通h而言Q第一件事情就是该学会Q如何让自己做事更合行业、公司的规矩、流E,能在q些范围内尽可能地提高业l。如果你有一天完全掌握且能改q、颠覆公司规则,你就能当你们公司的专家或者管理层Q如果你有一天能改进、颠覆行业的规则、流E,那你p创业、开qz了?span class="Apple-converted-space"> </span><br />    别看大公司的程琐碎Q流E的存在实际是ؓ了提高效率,q事工作三年以上的h都会认同。否则腾讯、百度就不用q两q花大力气从华ؓ、IBM{挖来改q管理了Q不程、制度的公司大多都是一些小作坊式的公司Q没前途更没钱途?span class="Apple-converted-space"> </span><br />Q?Q科学的学习工作Ҏ思\<span id="wqsu84i" class="Apple-converted-space"> </span><br />    q个׃多说了,每个行业、职业都不一P但是相同的是都肯定有Ҏ。做分布式开发应该先学什么,先做什么,有什么常规的模型、工P做品规划有哪些常规产品规划Ҏ、工兗做猎头分哪几个阶段Q每个阶D应该掌握什么能力、知识,如何做才能掌握这些能力、知识等{?nbsp; <span id="imoa844" class="Apple-converted-space"> </span><br />Q?Q大牛带、经验的U篏Q?span class="Apple-converted-space"> </span><br />     记得职场版有个新的伙子写q一个帖子,讲他涨薪的经历,写的蛮实在的。其中有一条我记得大概的意思就是,每天晚上加班看前人的文档、操作记录,看公司的前辈们如何处理问题、解决问题的。这些行业知识、经验有些公司是形成文档的,有些公司是靠你老大教给你的Q在q方面,如果是大牛或者公司有成熟的知识、经验分享制度,那会让你走很多弯\?span class="Apple-converted-space"> </span><br />    q个非常重要Q别人可能几个月、一两年处理故障、遭遇的问题、瓶颈浓~在你职业道路不同时期、恰到好处的几次培训中,会让你少摸烦很多q。^时乐于给你分享知识、经验,把他多年的知识分享给你,而不是没人分?#8212;—前提是知识是正确的?span class="Apple-converted-space"> </span><br />Q?Q少走弯?span class="Apple-converted-space"> </span><br />     q个弯\主要是指׃其它人,公司带来的媄响,例如产品人员水^一般,D需求经常变化,开发h员疲于奔命。公司渠道资源有问题Q大家辛苦做出的产品上线讉K量低Q无从得?消费者的真实反馈Q无法改q品。或者像cq样Q在明知道会有微信这LҎ会出现的情况下,q投入这么大的胦力、物力去做,跟当q金山officeL要打垮MS有啥区别?span class="Apple-converted-space"> </span><br />     一个品从做出来到有用P到有大量用户Q到成ؓ行业W一Q到发展遭遇瓉没法再提高,你从中收获到的经验是截然不同的,L在低水^重复是没有意义的。像我们做猎_从R到AC、C、SC、MC每步都是不一LQ一q协助别人做几十万的业W到自己带团队做几百万是不一L?span class="Apple-converted-space"> </span><br />  <br />  <br />———————————————————————————————————————————————<span id="8w8eyem" class="Apple-converted-space"> </span><br />抱歉Q看到微博催更的童鞋Q加班完回来抓紧写了会?span class="Apple-converted-space"> </span><br />今天写到这了,人手紧张Q天天加班,明天q得早vQ先z洗睡了Q明后天有空再写下一?#8212;—Z么不是创新工场、李开复的人品、移动互联网Q争取一气或两气呉|?nbsp; <br />  <br />  <br />  <br />20111104三更——————————————————————————————————————————————————————<span id="uw4uec4" class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none"><font size="4">四、找工作的常见几个误?#8212;—主要是指在互联网行业</font></strong><span id="84u8wu4" class="Apple-converted-space"> </span><br />     ׃最q收C各种渠道的善意的、不善意、赤裸的、隐晦的关爱、提醒、暗C、威胁,那家公司和某人的情况׃写了Q下面两章仅׃些求职的问题和Ud互联|做个探讨?span class="Apple-converted-space"> </span><br />     至于那家公司情况到底如何Q北邮也有很多童鞋在那实习过Q找人问问就知道了。问问各个团队的重组是否频繁Q管理如何,程是否有,如果有流E是否顺畅,培训是否满日常工作的需要,老大是否很有l验能让弟走弯\Q开发运营是否经常做无用功,ҎҎ自己的品推q渠道是否给力,问问C招的h都是啥情况(q个可以Ҏ一下同为创业公司的团的开发团队,两者比较,你就可以得出来有工作l验的h如何看待创新工场和美团)……把这些按照我上文写的那些标准Q跟其它offer做比较分析就可以了?span class="Apple-converted-space"> </span><br />  <br />     在这里,q讲个简单的ҎQ今qHR的校招招聘压力很大,你如果拿了多家公司的offerQ不知道如何权衡Q可以直接去问HR。让HR和业务部门给你徏议,分析各家offer的优劣,HR和业务部门会很尽心尽责地l你讲的Q多听几家的HR分析Q你q道该如何选择了。在q其中你也能看出各个HR和业务老板的h品到底如何?span class="Apple-converted-space"> </span><br />     说到q,我是真不知道某些新注册,发文?Qor故意跛_来讲“哪家公司招聘的时候不忽悠Q李开复忽悠怎么了?”的h是个啥意思?意思是别的HR都忽悠了Q某人忽悠大点,影响恶劣点就不算事了Q?span class="Apple-converted-space"> </span><br />  <br />    在此Q讨论几个小问题q行讨论?span class="Apple-converted-space"> </span><br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">1、去大公司就是一定当Z?/strong><span id="y4k4kqo" class="Apple-converted-space"> </span><br />    李开复宣讲的时候说“我去大公司工作过Q他们说Q恭喜你Q加入了全世界最牛的某某目l,今后你的工作是写一个按钮?#8221;Q这句话Q按照心理学Ԍ叫心理暗C?#8212;—看着是说自己的经历,但却l你暗示“你去大公司就是做Z钉,是写按?#8221;?span class="Apple-converted-space"> </span><br />     我想_某h是揣着明白装糊涂,有点睁眼说瞎话的意思。你去IBM、MS、通信业可能是q个样子Q行业很E_Q必然了。但是在互联|行业,明明是完全不同的?span class="Apple-converted-space"> </span><br />     李开复又不是没在google呆过Q他在google的时候不是很提倡给员工旉让员工自己来试一些东西吗Q在google那么大的公司里面Q不是很多研发都自己试过规划产品、运营品吗Q他q么快就忘了Q?span class="Apple-converted-space"> </span><br />     中国的互联网发展才这么几q_大部分企业有没什么成熟的程制度来让员工变成Z钉?也就baidu、腾讯这两年不愁生死了,在尝试做q方面的程制度?span class="Apple-converted-space"> </span><br />    大部分互联网公司都在担心明年、现在的生死问题Q没有精力搞什么螺丝钉制度。研发ؓ什么不能参与品设计?研发Z么不能帮助运营抓取数据来分析Q品ؓ什么不能参与运营来规划zdQ竞争对手都把品上U了Q用h都好几十万了Q那q有那么多规矩?你们q不抓紧以效率优先!q嘛呢!你们几个研发和品抓紧碰一下,赶紧做出来先上线Q看着q营数据直接改!再做不出来把你们都裁了?span class="Apple-converted-space"> </span><br />    所有的互联|公司,包括癑ֺ、腾讯在内(除了一些非常成型的部门Q例如新的新闻|站部门{,以及一些非帔R量Q必d的很l的工作Q如|页搜烦Q,不管你是研发q是其它Q只要你愿意Q你可以很轻村֜接触到别人的工作Q甚臛_以参与部分(当然Q大量地参与q了,该干点啥q点Q别把副业当MQ?span class="Apple-converted-space"> </span><br />    各个互联|企业的实际情况Q请自己去问问论坛的各个师兄师姐Q自己师兄师姐的说法Q比李开复靠q多。我所知道的是Q我们微软、宝z、华为等公司的候X选X人(<font color="#3cb371">你妹的,那三个字居然是敏感词Q害我尝试了无数遍,用了二分查找法才找到敏感词</font>Q去了baidu、腾讯,W一反应是——靠,q些互联|公司管理怎么q么混ؕ、职责变来变去,产品动不动就调整Q我怎么q要承担别的部门的工作职责?癑ֺ、腾讯尚且如此,更不用说其它公怺?br />  <br />  <br />2、轮岗、兼?span class="Apple-converted-space"> </span><br />   术业有专攻,你相信一个h又做产品又干研发Q比专做产品能做的更好?你作Z个新人,能把一样东西做好就行了。很多东西你了解一下不p了吗Qؓ什么要做兼作?专做一件事情,对你的能力、知识等提升更快?span class="Apple-converted-space"> </span><br />  <br />    如果有h对你说经常换部门对于当管理层有帮助的Q除非那人是你爸Q他准备让你轮岗之后当CEOQ否则赶紧踹他一脚给他一巴掌让他闭嘴。在目前的中国,已经有成熟的轮岗、提升计划,且有成功先例的大公司一只手数q来了。这几年Q很多公司的理培训生计划最后都不了了之Q招q去的h打落牙和血吞,更多的是变成了销售培训生的代名词。更不用说在没有轮岗、培养规划的公司里面了这些h会落个什么结果?span class="Apple-converted-space"> </span><br />    <br />    一个公司如果说Q我们打让你多q几块工作,专注提高一下,我只能说——他在忽悠你。我再D个例子,在我们猎头业Q有些猎头公司哪怕一些大的猎头公司,员工是进来之后分个大行业Q然后不分细分行业,不分职业角色都做。你可以xQ一个h又做互联|研发类的职位,又做通信c销售的职位Q还做Y件类试的职位,他最后挖人的时候能比得q专做移动互联网研发Q专做通信业销售的猎头吗?<span id="ys64eu8" class="Apple-converted-space"> </span><br />  <br />3、可以快速致?span class="Apple-converted-space"> </span><br />    收益=成本×投资回报?#215;Q?-p|率)<span id="8msc444" class="Apple-converted-space"> </span><br />    你在q轻的时候,成本?0~20万(你的薪水、期权)Q回报率?00%Q给底层员工q个回报率了不v了)Q失败率?9.9%Q眼光不行,不具备判断力Q能力不够,没法控制局面降低风险)?span class="Apple-converted-space"> </span><br />    你在3?0岁的时候,成本??0万,回报率是3000%甚至癑ր(l部门经理的Q给创业骨干的肯定不一PQ失败率?0%Q创业风险L有的Q?span class="Apple-converted-space"> </span><br />    你自q帐吧?span class="Apple-converted-space"> </span><br />4、暴富机会一M复返<span id="woiu4q8" class="Apple-converted-space"> </span><br />    引用李开复老师的一句话来回{?#8212;—“中国q_九年出现一ơ大发胦成功Z”Q所以你不用急着去赶李开复老师宣传的这ơ移动互联网热潮?q后q有呢?span class="Apple-converted-space"> </span><br />  <br />    引用我写《通信行业求职宝典》写的一D话Q?#8220;10q前Q没有h会想到SP公司会这么挣钱,新浪、搜狐等公司能靠着SP业务撑过了互联网最为寒L一D|间?q前Q没有没有h会想到RIM会凭借黑莓达Cq?0亿美元的q收入,净利润可以辑ֈ13亿美元;6q前没有Z惛_彩铃也会挣钱Q一?#8220;疯狂青蛙”居然能带?000多万英镑的收入,4q前没有Z意识到彩信报q种几个人就可以做的产品会有数百万数千万的订阅者,2q前没h惛_RIM很快没落过时了Q?q前没h惛_Ud互联|的泡沫会如此之?#8230;…”<span id="4u8844c" class="Apple-converted-space"> </span><br />  <br />5、期?span class="Apple-converted-space"> </span><br />    我只惌Q我认识的中高层候X选X人,谈offer大家一般最x的是薪水Q鲜有最x股票、期权的Q越高层如此,l股、期权再多也不如l钱实在。公司给你股期权是Z让你暴富的还是ؓ了让你承担公司发展风险的Q?span class="Apple-converted-space"> </span><br />    公司如果眼瞅着明年׃定能上市Q或者公司股明q一定比现在?00%Q公ؓ什么要l你q个捞钱的机会?股东方自己钱太多了?<span id="8e8smig" class="Apple-converted-space"> </span><br />    收益高Q风险越高。如果有公司的期权能让你比同龄h?0%的收益,那意味着q事q有点希望,要是能多100%Q那意味着q事不靠谱,<span id="eic88wg" class="Apple-converted-space"> </span><br />    要是能多1000%Q那基本肯定q事没啥希望了?span class="Apple-converted-space"> </span><br />  <br />———————————————————————————————————————————————————<span id="ykwq4qs" class="Apple-converted-space"> </span><br />中场休息Q吃夜宵Q晚上再更一ơ最后一D,写写Ud互联|。之前说的最后一部分“offer选择”׃写,没时_明天q要q活?span class="Apple-converted-space"> </span><br />  <br />四更————————————————————————————————<span id="4ae4a4a" class="Apple-converted-space"> </span><br />  <br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none"><font size="4">五、李开复对于移动互联网的看法和我对于移动互联网的看?/font></strong><span id="gq4eow4" class="Apple-converted-space"> </span><br />     单分析一下,l的东西大家可以自己分析。我l个分析的方?#8212;—多看看各个互联网大{的动作和演讲Q多去问问师兄师姐各个公司实际的人力、胦力投入。跟着业内的大佬,而不是记者、爱炒作的h赎ͼ你一般成功概率会更高一些?span class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">1、移动互联网的市场前景:</strong><span id="4u4comk" class="Apple-converted-space"> </span><br />     “如果传统互联|的三大巨头Q百度腾讯阿里加在一Pg千五百亿金的话Q那么,Ud互联|三个巨_是一千五百亿金的十倍,一万五千亿金?#8221;  <br />     对于q段话,互联|大佬们大多选择了无视,VC们大多选择了支持这D话。有个互联网老大隐讳地调侃了一下,当然Qh家说的很客气Q不像我说的那么直接Q他说的?#8220;国股市市值最高的三家公司,埃克美?Ҏ/微Y加v来市?千多亿美?中国无线互联|三巨头10q后市值加h要达?.5万亿......中国人民,站v来了......”?span class="Apple-converted-space"> </span><br />  <br />     他列丄是美国前三,而全世界市值前三的公司加v来都没有一万五千亿……我估计李开?.5万亿的计基是全球货币高速贬|而不是移动互联网高速发展?span class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">2、机会大</strong><span id="g84s4qw" class="Apple-converted-space"> </span><br />“q个ZQ我可以保证Q绝Ҏ1999q的更大Q也许大五倍,也许大十倍,或者五十倍,具体大多我不好_但是我肯定,l对比当q丁马云的Z要大很多?#8221;<span id="k8m4c8o" class="Apple-converted-space"> </span><br />  <br />     |易手里有着一癑֤亿的现金Q既然这个机会比丁磊当年大多了,那丁ؓ什么不投个几亿招几百hq来开发?<span id="8864yiy" class="Apple-converted-space"> </span><br />     现在全国所有的Ud互联|项目加hq不够网易一家收购的。网易直接都CQ然后就可以直接再造一个百倍于|易的公司,岂不是最快捷Q?span class="Apple-converted-space"> </span><br />     做ؓ曄的中国首富,W一代互联网CEOQ目前中国最赚钱的三家互联网公司之一的老板Q丁的互联|从业、烧钱、赚q验可比李开复丰富多了?br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">3、发?/strong><span id="acey48g" class="Apple-converted-space"> </span><br />“你要来创新工场,从基层做P从工E师做v。你在百度微软中国银行,可能十年二十q_你能成ؓ一个中层或高层理者,而在创业公司Q快的两三年Q慢的七八年Q完全有可能创业成功?#8221;<span id="4ieom8y" class="Apple-converted-space"> </span><br />  <br />唉,两三q的中高层,让我们羞愧地掩面而泣ѝ?nbsp; <br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">4、品竞争激烈度</strong><span id="8844c44" class="Apple-converted-space"> </span><br />     大家ȝ看豌豆荚的品,再去看看qq推出的应用助手。豌豆荚是去q?月䆾推出来的Qqq应用助手是今q?月推出来的,两者一个推出来?8个月Q一个推出来?个月Q你ȝ看现在两者功能的差距。qqq用助手不知道现在装机量过豌豆荚没有,q没超q,我估计也是几个月的事情?span class="Apple-converted-space"> </span><br />  <br />     大家再随便去qq旗下挑一些手机客L产品Q看看适配的终端种c,再去业内的其它移动互联网新秀们看看?不在一个量U?span class="Apple-converted-space"> </span><br />     Androidl了很多手机公司ZQ但是也lY件开发者带来了巨大的麻烦。就例如l端适配q个事情Q不做,用户体验差,做,公司ҎM赯样一个团队。有些时候我甚至觉得在移动互联网上做东西q不如在腾讯{的开攑^C做东西,L不用去考虑各个l端的种cR版本、屏q等?span class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">5、渠?/strong><span id="84mkywm" class="Apple-converted-space"> </span><br />“推销不需要耗费巨大的渠道费用,直接l过搜烦C交引擎推广”<span id="su4s444" class="Apple-converted-space"> </span><br />ucweb做了那么大了Q今q在预装渠道里面被腾讯卡的死ȝ——你手机公司要么装我的qq和qq览器,要么你装他的Ucweb但是不能装QQQ钱我给的更多?span class="Apple-converted-space"> </span><br />没钱Q哪来的量Q真靠社交推q就能推qv来,360哪能那么霸气当Y件渠道商Q?span class="Apple-converted-space"> </span><br />  <br />     q两天还看到个很有趣的事情,跟大家分享一下。前几天苏宁易购图书上线搞活动,京东也搞zdQ当当也搞活动。苏宁的pȝ最烂,0点就挂了Q??Ҏ好,zd也最一般?span class="Apple-converted-space"> </span><br />     但在某几家新闻门L到的报道都是“苏宁易购血战XXXQ投入巨资不惜亏?#8221;Q半Ҏ提过pȝ挂掉的事情,而京东当当的新闻?#8220;京东当当图书战被指花׃骂名Q大部分~”Q边上还挂着一个新?#8220;京东重磅促销遇网l瘫?10月被投诉389?#8221;?span class="Apple-converted-space"> </span><br />  <br />     呵呵Q有旉大家可以多观察一下新、腾讯、搜狐的新闻Q基本都是对掐,你看到的新闻都是资本家们惌你看到的Q不是新闻|站q是微博?span class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">6、移动互联网薪水和其它行业的薪水</strong><span id="i84ue4m" class="Apple-converted-space"> </span><br />     Ud互联|发展很快很大,薪水被抬的很高?span class="Apple-converted-space"> </span><br />     例如我们很多客户开的条仉是:??q的相关l验Q能独立q活的,不用名校毕业Q不用算法好Q做Android的就能到20来万Q做iPhone的能?5万,更高的也有。远过同期其它行业的hQ我们前几年q到这个趋势,前两qv储备h才,q一q收益颇多?span class="Apple-converted-space"> </span><br />     但是Q我们自q判断是,现在的薪水沫在2?q左右会慢慢破掉Q这个行业的门槛很低Q技术难度ƈ不大Q这几年q去的应届生2?q成长v来后׃会这么夸张?span class="Apple-converted-space"> </span><br />  <br />     而且Q移动互联网客户端开发未来成长空间较,毕竟比v后台、搜索等Q技术难度在那摆着。在我们知道的所有互联网公司里面Qv薪都很高Q但是超q?0万薪水的职位很少Q?5万的|见Q?0万的工程师职位没见过几个。但是我们做的分布式后台、搜索、数据挖掘等职位Q??0万的很普遍,1?00万的职位也有Q大家可以自己思考一下ؓ什么?span class="Apple-converted-space"> </span><br />     因此我觉得,如果你热爱开发,技术大牛,可以选择后台、数据挖掘、搜索等隑ֺ较大的,如果不是特别热爱开发,不是技术大牛,那你在Android开发和常规的一些开发职位中可以选择Android开发之cȝQ毕竟都是工作,未来泡沫灭了也不会差到哪去,Lq几q收入不错?span class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">7、移动互联网的创业环境和前景?/strong><span id="eyau8ca" class="Apple-converted-space"> </span><br />     Ud互联|的Z不少Q也是未来必然的势Q但是跟团队没啥关p,包括现在在iPhone应用市场上,团队存zȝ概率很低Q开发、UI、推q等都是要钱的,人员成本也很c?span class="Apple-converted-space"> </span><br />     有不移动互联网公司找我们招hQ我们的W一句话是你给我预付费我也不给你们做,太难了。大公司都抢不过来hQ何谈小公司QsoQ这也是李老师Z么这么着急的原因。毕竟创新工2?q能zM来,不管最后成几个目Q他q成功了,要是在这轮沫结束前zM下来Q他可能成ZW二个方东兴?span class="Apple-converted-space"> </span><br />  <br />     现在的创业环境比以前要糟p,当年遍地都是ZQ全是空白的Q现在创业你能做的就是依附一颗大树创业,在qq、百度、阿里系{公司框下的圈子里面创业Q当q的淘宝都畏惧百度,现在的京东都畏惧etaoQ何谈其它?span class="Apple-converted-space"> </span><br />  <br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">8、创业门?/strong><span id="8qu444c" class="Apple-converted-space"> </span><br /> “今天的创业和以前不一样了Q你只要做一个最低的不被用户骂的产品Q先推向市场。不要太花力气琢用户喜Ƣ黑色还是红Ԍ一半黑一半红Q哪个黏性大q哪个Q不要考虑让用h册好q是不注册好Q一半注册一半不注册Q看用户反应。如果你做汽车,一半黑一半红Q行吗?成本太大Q做软g互联|最大的好处Q就是无本生意,用户也不用付钱,互联|就是你的实验室?#8221;<span id="4soqym8" class="Apple-converted-space"> </span><br />  “采用云计,不需要买服务器和带宽Q采用开源YӞ大大节省工程师成本;推销不需要耗费巨大的渠道费用,直接l过搜烦C交引擎推广Q大大节U了营销成本……150万就够了。虽然不很低,但这是历史新低?span class="Apple-converted-space"> </span><br />  <br />     论据我就不评价了Q如果论Ҏ正确的,的确门槛低,那么我想?#8212;—对创业者而言Q在初期x一把就赎ͼ门槛低是个好事,如果在中后期Q那直是个灾难,门槛低竞争激烈。只能比烧钱速度和兜里的银子了?span class="Apple-converted-space"> </span><br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">9、移动互联网前景</strong><span id="48ee84e" class="Apple-converted-space"> </span><br />     q话题太大了Q我懒得写,只想_前景很开阔,但是走势很难定,鹿死谁手未知Q且未来Ud互联|开发的隑ֺ、门槛、^台到底是什么样Q不知道。当有一天折叠屏q、投影、电池技术都解决的时候,Ud互联|和互联|的界限真会那么清晰吗?Q貌似现在已l很模糊了)?span class="Apple-converted-space"> </span><br />     而且Q轻客户端,web化已l成Z一个必然的势Q无U传输技术、材料学的发展给q个行业带来了很多不定性?span class="Apple-converted-space"> </span><br />  <span id="48cqw48" class="Apple-converted-space"> </span><br />  <br /><font size="4"><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">六、再?/strong></font><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">和祝?/strong><span id="m48waoo" class="Apple-converted-space"> </span><br />     以后慢慢不写东西了Q老了Q从真情露job版到北邮坛job版,该写的东襉K重复一万遍了,没有啥写东西的欲望,也没啥新东西好写的,每年看到你们讨论的都是一L话题Q都看了6?q了。这可能是我最后一ơ在job版写长文了,q底可能在职场版再写一长文,我的论坛生活差不多over了,论坛已经不是我们q个时代的h的了?span class="Apple-converted-space"> </span><br />  <br />  <br /><strong style="border-right: 0px; padding-right: 0px; border-top: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; padding-top: 0px; border-bottom: 0px; list-style-type: none">在最后,惛_各位师弟Q师妹说的是——<span id="a8uwkay" class="Apple-converted-space"> </span><br />各位师弟Q师姐师Ҏ你们的,offer和银子也是你们的Q?span class="Apple-converted-space"> </span><br />各位师妹Q师兄师弟是你们的,师姐师妹有时候也是你们的Qoffer和户口也是你们的Q?span class="Apple-converted-space"> </span><br />看到不少公司今年开?0多万的offerQ你们可以一定要努力Q一定给北邮争光Q户口和50万的offer都要l母校拿一堆回来!<span id="eqsco8a" class="Apple-converted-space"> </span><br />  <br />大家找工作利Q?1月才刚开始,后箋的\q长。论坛以后靠你们啦!扑֮工作了别忘了l你们的师弟师妹们多分n点经?/strong>Q?span class="Apple-converted-space"> </span></span></span><img src ="http://www.shnenglu.com/Husiwa/aggbug/159702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Husiwa/" target="_blank">IT菜鸟</a> 2011-11-06 11:31 <a href="http://www.shnenglu.com/Husiwa/archive/2011/11/06/159702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EFFECTIVE STL -16-22http://www.shnenglu.com/Husiwa/archive/2011/10/19/158697.htmlIT菜鸟IT菜鸟Wed, 19 Oct 2011 10:29:00 GMThttp://www.shnenglu.com/Husiwa/archive/2011/10/19/158697.htmlhttp://www.shnenglu.com/Husiwa/comments/158697.htmlhttp://www.shnenglu.com/Husiwa/archive/2011/10/19/158697.html#Feedback0http://www.shnenglu.com/Husiwa/comments/commentRss/158697.htmlhttp://www.shnenglu.com/Husiwa/services/trackbacks/158697.html16.vector和string传给遗留的API
*vector ,const char* c ,?&vector[0]卛_
*string Qstring.c_str()

17.使用“交换技?#8221;来修正过剩容?br />*vector<Contestant> vec(contestants).swap(contestants)

18.避免使用vector<bool>
两个问题
*它不是一个STL容器Q它q不容纳bool
如果C是一个Tcd的对象的容器Q且C支持operator[],那么以下代码必须能够通过~译
T* p= &c[0] //无论operator[]q回什么,都可以用q个地址初始化一个T*
但是vector<bool>中做了优化,里面存放的是bit?br />deque内部内存不是q箋的,但里面存的是bool?br />q有一个bitse可解册个问?/p>

19.了解相等和等L区别
*相等的概忉|Zoperator== ,{h的概念基于operator<
20.为指针的兌容器指定比较cd
兌容器?相同 的定义是{h

21.永远让比较函数对相等的D回false

22.避免原地修改set和multiset的键

 



IT菜鸟 2011-10-19 18:29 发表评论
]]>
EFFECTIVE-STL-10-12http://www.shnenglu.com/Husiwa/archive/2011/10/12/158147.htmlIT菜鸟IT菜鸟Wed, 12 Oct 2011 09:51:00 GMThttp://www.shnenglu.com/Husiwa/archive/2011/10/12/158147.htmlhttp://www.shnenglu.com/Husiwa/comments/158147.htmlhttp://www.shnenglu.com/Husiwa/archive/2011/10/12/158147.html#Feedback0http://www.shnenglu.com/Husiwa/comments/commentRss/158147.htmlhttp://www.shnenglu.com/Husiwa/services/trackbacks/158147.html条款10 ?11不太懂,以后再看?br />

条款10Q注意分配器的协定和U束
如果要自定义分配?br />*把你的分配器做成一个模板,带有模板参数TQ代表你要分配的内存的对象类?br />*提供pointer和reference的typedefQ但L让pointer是T* reference是T&
*通常Q分配器不能有非静态的数据成员
*记得应该传给分配器的allocate成员函数需要分配的对象个数而不是字节数Q也应该记得q些函数q回T*指针Q即时还没有T对象被构?br />*一定要提供标准容器依赖的内嵌rebind模板

条款12Q对STL容器U程安全性的期待现实一?/p>

template<typename Container>
class Lock
{
public:
 Lock(
const Container container): c( containner ){
  getMutexFor( c );
 }

 
~Lock(){
  releaseMutexFor( c );
 }

private:
const Container& c;

}
;

vector
<int> v;
{
 Lock
< vect< int > > lock( v );
 vector
<int>::iterator first5( find(v.begin() v.end(), 5));
 
if( first5 != v.end()){
  
*first5 = 0;
 }

}


 



IT菜鸟 2011-10-12 17:51 发表评论
]]>
EFFECTIVE-STL9http://www.shnenglu.com/Husiwa/archive/2011/10/11/158063.htmlIT菜鸟IT菜鸟Tue, 11 Oct 2011 08:24:00 GMThttp://www.shnenglu.com/Husiwa/archive/2011/10/11/158063.htmlhttp://www.shnenglu.com/Husiwa/comments/158063.htmlhttp://www.shnenglu.com/Husiwa/archive/2011/10/11/158063.html#Feedback0http://www.shnenglu.com/Husiwa/comments/commentRss/158063.htmlhttp://www.shnenglu.com/Husiwa/services/trackbacks/158063.html*在一个标准STL容器中去掉gؓ1963的对象,若是一个连l内存容器,最好的Ҏ是erase-remove
c.erase ( remove( c.begin(), c.end(), 1963 ), c.endQ) Q;//当C时vector,string ,dequeӞq是一处特定值得元素的最x?br />*当C是标准关联容器的时?map, set)使用M叫做remove的东襉K是完全错误的
而应该直接采用c.erase(1963)Ҏ的高效时?br />*但如果操作是从C中除L个有特定值的物体
bool bandValue(int x)
对于序列容器Qvector, string,deque,list)我们要做的只是把每个remove替换为remove_if然后OK?br />c.erase( remove_if(c.begin(), c.end(), badValue), c.end())//vector,string,deque
c.remove_if( badValue ) //list
对于标准兌容器Q?br />AssocContainner<int> c;
for(AssoContainer<int>::iterator i = c.begin();
i!= c.end(); )
{
 if(badValue(*i)) c.erase(i++);
 else ++i;
}


IT菜鸟 2011-10-11 16:24 发表评论
]]>
EFFECTIVE-STL5-7http://www.shnenglu.com/Husiwa/archive/2011/10/11/158057.htmlIT菜鸟IT菜鸟Tue, 11 Oct 2011 07:03:00 GMThttp://www.shnenglu.com/Husiwa/archive/2011/10/11/158057.htmlhttp://www.shnenglu.com/Husiwa/comments/158057.htmlhttp://www.shnenglu.com/Husiwa/archive/2011/10/11/158057.html#Feedback0http://www.shnenglu.com/Husiwa/comments/commentRss/158057.htmlhttp://www.shnenglu.com/Husiwa/services/trackbacks/158057.html条款五,量使用区间成员函数代替他们的单元素兄弟
*对于所有标准序列容?vectorQ?string, deque, 和list)都有效,无论何时你必d全替代一个容器的内容Q你应该想到赋?br />*insertQ每ơ都必须Ud为新元素腑ևI间
*序列容器erase时返回P代器Q而关联容器返回空

条款六,警惕C++最令h恼怒的解析
int g( double pf() ) pf其实是一个指?br />int g( double() );同上Q函数名省略
int g( double x) == int g( double (x) )

条款七, 当时用new得指针的容器Ӟ记得在销毁容器前delete那些指针
*q样的代码造成内存泄露

void doSomething()
{
 vector
<Widget*> vwp;
 
for(int i =0 ; i < SOME_MAGIC_NUMBER; ++i)
 
{
  vwp.push_back(
new Widget);
 }

 
//使用完毕的时候,vwp内的Widget对象没有释放
}



最单的实现Ҏ?/p>

void doSomething()
{
 
for(vector<Widget*>::iterator i = vwp.begin(); != vwp.end(); ++i)
 
{
  delete 
*i;
 }

}



q样的问题是for循环代码多余for_eachQ但没有使用for_each单明?br />另一个问题是q段代码不是异常安全?/p>

z不考虑异常的方?/p>

struct DeleteObject{
 template
<typename T>
 
void operator()(const T* ptr) const
 
{
  delete prt;
 }

}
;
void doSomething()
{
 deque
<SpecialString*> dssp;
 for_each( dssp.begin(), dssp.end(), DeleteObject());
}


void doSomething()
{
 typedef boost::shar_ptr
<Widget> SPW;
 vector
<SPW> vwp;
 
for(int i = 0; i <SOME_MAGIC_NUMBER; ++i)
 
{
  vwp.push_back( SPW(
new Widget));
 }

}



 



IT菜鸟 2011-10-11 15:03 发表评论
]]>
EFFECTIVEC STL 3/4http://www.shnenglu.com/Husiwa/archive/2011/10/10/157989.htmlIT菜鸟IT菜鸟Mon, 10 Oct 2011 10:31:00 GMThttp://www.shnenglu.com/Husiwa/archive/2011/10/10/157989.htmlhttp://www.shnenglu.com/Husiwa/comments/157989.htmlhttp://www.shnenglu.com/Husiwa/archive/2011/10/10/157989.html#Feedback0http://www.shnenglu.com/Husiwa/comments/commentRss/157989.htmlhttp://www.shnenglu.com/Husiwa/services/trackbacks/157989.html条款?使容器里对象的拷贝量轻而正?br />*容器中的对象都是拯来拷贝出?br />*容器的拷贝要注意基类的切割问?br />*使拷贝更高效、正,且对分割问题免疫的简单的方式是徏立指针的容器而不是对象的容器Q最好是指针

条款?容器用empty来代替检查size()是否?
*理由很简单,对于所有的标准容器Qempty是一个常数时间的操作Q但对于一些List实现Qsize()pU性时?br />*list的sizepU性时间是因ؓZ让splice变ؓ常数旉Q这是一个让哪个函数实现最高效率的问题

所以对于所有容器来_用empty()而不是size()==0



IT菜鸟 2011-10-10 18:31 发表评论
]]>
EFFECTIVE-STL-2http://www.shnenglu.com/Husiwa/archive/2011/10/10/157984.htmlIT菜鸟IT菜鸟Mon, 10 Oct 2011 09:43:00 GMThttp://www.shnenglu.com/Husiwa/archive/2011/10/10/157984.htmlhttp://www.shnenglu.com/Husiwa/comments/157984.htmlhttp://www.shnenglu.com/Husiwa/archive/2011/10/10/157984.html#Feedback0http://www.shnenglu.com/Husiwa/comments/commentRss/157984.htmlhttp://www.shnenglu.com/Husiwa/services/trackbacks/157984.html条款?心对容器无关的qL

UML 的几?ȝQ不一定对。?br />兌一般保存的都是指针
聚合一般保存的都是对象
依赖一般都是参?br />兌都是我主动方指向被动?br />
一般来讲不要这么写Q?/p>
class Widget{};
vector
<Widget> vw;
Widget bestWidget;
vector
<Widget>::iterator i = find(vw.begin(), vw.end(),bestWidget);


 

要这么写

 

class Widget{};
typedef vector
<Widget> WidgetContainer;
typedef WidgetContainer::iterator WCIterator;
WidgetContainer cw;
Widget bestWidget;
WCIterator i 
= find(cw.begin(), cw.end(),bestWidget);

 



IT菜鸟 2011-10-10 17:43 发表评论
]]>
EFFECTIVE-STL-1http://www.shnenglu.com/Husiwa/archive/2011/10/10/157956.htmlIT菜鸟IT菜鸟Mon, 10 Oct 2011 05:33:00 GMThttp://www.shnenglu.com/Husiwa/archive/2011/10/10/157956.htmlhttp://www.shnenglu.com/Husiwa/comments/157956.htmlhttp://www.shnenglu.com/Husiwa/archive/2011/10/10/157956.html#Feedback0http://www.shnenglu.com/Husiwa/comments/commentRss/157956.htmlhttp://www.shnenglu.com/Husiwa/services/trackbacks/157956.html*vector<char>可以作ؓstring的替代品
*vector list deque Qvector是一U可以默认用的序列cdQ当很频J的对序列中q行插入和删除的时候应该用listQ大部分发生在尾部的话用dequeq种数据l构
*q箋内存容器和基于节点的容器的区?br />q箋容器vector/string/deque在一个或者多个内存块中保存它们的元素Q如果新元素被插入或者已存元素被删除Q其他在同一个内存块中的元素必须向上或者向下移动来为新元素提供I间或者填充原来被删除的元素所占的I间Q这U移动媄响了效率?br />Z节点的listQ插入或者删除的时候不需要移?br />*序列容器在Q意位|插入一个新元素Q关联容器不可以
*容器中的数据的内存布局需要兼容C吗,如果是,那只能用vector
*查找速度Q散列容器》排序的vector>标准的关联容?br />*需要可靠的插入和删除的能力Q如果是需要用基于节点的容器
*需要P代器、指针、引用的实效ơ数减少到最,如果是,使用介于节点的容器,一般来_在连l容器上的插入和删除会所有指向容器的q代器指针和引用实效

IT菜鸟 2011-10-10 13:33 发表评论
]]>
服务器设??/title><link>http://www.shnenglu.com/Husiwa/archive/2011/09/23/156625.html</link><dc:creator>IT菜鸟</dc:creator><author>IT菜鸟</author><pubDate>Fri, 23 Sep 2011 10:21:00 GMT</pubDate><guid>http://www.shnenglu.com/Husiwa/archive/2011/09/23/156625.html</guid><wfw:comment>http://www.shnenglu.com/Husiwa/comments/156625.html</wfw:comment><comments>http://www.shnenglu.com/Husiwa/archive/2011/09/23/156625.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/Husiwa/comments/commentRss/156625.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Husiwa/services/trackbacks/156625.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 18px; font-family: Arial, Helvetica, sans-serif; font-size: 12px" class="Apple-style-span"> <p><span style="text-align: left; widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; border-collapse: separate; font: 12px/18px Arial; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><strong>务器l构探讨 -- 最单的l构</strong><span id="ceqcu4y" class="Apple-converted-space"> </span><br /><br />  所谓服务器l构Q也是如何服务器各部分合理地安排Q以实现最初的功能需求。所以,l构本无所谓正与错误Q当Ӟ优秀的结构更有助于系l的搭徏Q对pȝ的可扩展性及可维护性也有更大的帮助?span class="Apple-converted-space"> </span><br /><br />  好的l构不是一y而就的,而且每个设计者心中的那把都不相同,所以这个优Ul构的定义也没有定论。在q里Q我们不打算对现有游戏结构做评hQ而是试着从头开始搭Z个我们需要的MMOGl构?span class="Apple-converted-space"> </span><br /><br />  对于一个最单的游戏服务器来_它只需要能够接受来自客L的连接请求,然后处理客户端在游戏世界中的Ud及交互,也即游戏逻辑处理卛_。如果我们把q两功能集成到一个服务进E中Q则最l的l构很简单:<span id="4k8s84w" class="Apple-converted-space"> </span><br /><br />  client ----- server<span id="4y8m8wm" class="Apple-converted-space"> </span><br /><br />  嗯,太简单了点,q样也敢叫服务器l构Q好吧,现在我们来往里面E稍加点东西Q让它看h更像是服务器l构一些?span class="Apple-converted-space"> </span><br /><br />  一般来_我们在接入游戏服务器的时候都会要提供一个帐号和密码Q验证通过后才能进入。关于ؓ什么要提供用户名和密码才能q入的问题我们这里不打算做过多讨论,云风曑֯此也提出q类似的疑问Qƈl出了只用一个标识串pq入的设惻I有兴的可以ȝ看他们的讨论。但不管是采用何U方式进入,照目前看来我们的服务器v码得提供一个帐号验证的功能?span class="Apple-converted-space"> </span><br /><br />  我们把观察点先集中在一个大区内。在大多数情况下Q一个大区内都会有多l游戏服Q也是多个游戏世界可供选择。简单点来实玎ͼ我们完全可以抛弃q个大区的概念,认ؓ一个大Z是攑֜同一个机房的多台服务器组Q各服务器组间没有什么关pR这P我们可ؓ每组服务器单独配备一台登录服。最后的l构囑ֺ该像q样Q?span class="Apple-converted-space"> </span><br /><br />  loginServer   gameServer<span id="ueqaus8" class="Apple-converted-space"> </span><br />     |           /<span id="as88484" class="Apple-converted-space"> </span><br />     |         /<span id="cey8m84" class="Apple-converted-space"> </span><br />     client<span id="4qoqck8" class="Apple-converted-space"> </span><br /><br />  该结构下的玩家操作流EؓQ先选择大区Q再选择大区下的某台服务器,x个游戏世界,点击q入后开始帐号验证过E,验证成功则进入了该游戏世界。但是,如果玩家惌切换游戏世界Q他只能先退出当前游戏世界,然后q入新的游戏世界重新q行帐号验证?span class="Apple-converted-space"> </span><br /><br />  早期的游戏大都采用的是这U结构,有些游戏在实现时采用了一些技术手D得在切换游戏服时不需要再ơ验证帐P但整体结构还是未做改变?span class="Apple-converted-space"> </span><br /><br />  该结构存在一个服务器资源配置的问题。因为登录服处理的逻辑相对来说比较单,是玩家提交的帐号和密码送到数据库进行验证,和生成会话密钥发送给游戏服和客户端,操作完成后连接就会立x开Q而且玩家在以后的游戏q程中不会再与登录服打Q何交道。这样处理短q接的过E得系l在大多数情况下都是比较I闲的,但是在某些时候,׃h比较密集Q比如开新服的时候,d服的负蝲又会比较大,甚至会处理不q来?span class="Apple-converted-space"> </span><br /><br />  另外在实际的游戏q营中,有些游戏世界很火爆,而有些游戏世界却非常hQ甚x有多h玩的情况也是很常见的。所以,我们能否更合理地配置d服资源,使得整个大区内的d服可以共享就成了下一步改q的目标?span class="Apple-converted-space"> </span><br /><br /><strong>服务器结构探?-- d服的负蝲均衡</strong><span id="i84448k" class="Apple-converted-space"> </span><br /><br />  回想一下我们在玩wow时的操作程Q运行wow.exeq入游戏后,首先׃要求我们输入用户名和密码q行验证Q验证成功后才会出来游戏世界列表Q之后是排队q入游戏世界Q开始游?..<span id="4oceyeu" class="Apple-converted-space"> </span><br /><br />  可以看到跟前面的描述有个很明昄不同Q那是要先验证帐号再选择游戏世界。这U结构也׃得登录服不是固定配备l个游戏世界Q而是全区共有的?span class="Apple-converted-space"> </span><br /><br />  我们可以试着从实际需求的角度来考虑一下这个问题。正如我们之前所描述q的那样Q登录服在大多数情况下都是比较空闲的Q也许我们的一个拥?0个游戏世界的大区仅仅使用10台或更少的登录服卛_满需求。而当在开新区的时候,或许要配?0台登录服才能应付那如潮水般涌入的玩家dh。所以,d服在设计上应该能满q种动态增删的需求,我们可以在Q何时候ؓ大区增加或减登录服的部|Ӏ?span class="Apple-converted-space"> </span><br /><br />  当然Q在q里也不会存在要求添加太多登录服的情c还是拿开新区的情冉|_即新增加登录服满了玩家登录的hQ游戏世界服的承载能力依然有限,玩家一样只能在排队pȝ中等待,或者是q入到游戏世界中D大家都卡?span class="Apple-converted-space"> </span><br /><br />  另外Q当我们在增加或U除d服的时候不应该需要对游戏世界服有所改动Q也不会要求重启世界服,当然也不应该要求客户端有什么更新或者修改,一切都是在背后自动完成?span class="Apple-converted-space"> </span><br /><br />  最后,有关数据持久化的问题也在q里考虑一下。一般来_使用现有的商业数据库pȝ比自己手工技术先q要明智得多。我们需要持久化的数据有玩家的帐号及密码Q玩家创建的角色相关信息Q另外还有一些游戏世界全局共有数据也需要持久化?span class="Apple-converted-space"> </span><br /><br />  好了Q需求已l提出来了,现在来考虑如何其实现?span class="Apple-converted-space"> </span><br /><br />  对于负蝲均衡来说Q已有了成熟的解x案。一般最常用Q也最单部|的应该是基于DNS的负载均衡系l了Q其通过在DNS中ؓ一个域名配|多个IP地址来实现。最新的DNS服务已实CҎ服务器系l状态来实现的动态负载均衡,也就是实C真正意义上的负蝲均衡Q这样也有效地解决了当某台d服当机后QDNS服务器不能立卛_出反应的问题。当Ӟ如果找不到这L解决ҎQ自׃头打造一个也q不难。而且Q通过DNS来实现的负蝲均衡已经包含了所做的修改对登录服及客L的透明?span class="Apple-converted-space"> </span><br /><br />  而对于数据库的应用,在这U结构下Q登录服及游戏世界服都会需要连接数据库。从数据库服务器的部|上来说Q可以将帐号和角色数据都攑֜一个中心数据库中,也可分ؓ两个不同的库分别来处理,基到从物理上分到两台不同的服务器上去也行?span class="Apple-converted-space"> </span><br /><br />  但是对于不同的游戏世界来_其角色及游戏内数据都是互相独立的Q所以一般情况下也就为每个游戏世界单独配备一台数据库服务器,以减L据库的压力。所以,整体的服务器l构应该是一个大区有一台帐h据库服务器,所有的d服都q接到这里。而每个游戏世界都有自q游戏数据库服务器Q只允许本游戏世界内的服务器q接?span class="Apple-converted-space"> </span><br /><br />  最后,我们的服务器l构像q样Q?span class="Apple-converted-space"> </span><br /><br />               大区服务?nbsp;      <span id="8w4eomu" class="Apple-converted-space"> </span><br />          /     |       \<span id="m4wysgw" class="Apple-converted-space"> </span><br />            /       |        \<span id="48asm84" class="Apple-converted-space"> </span><br />            d?   d?   世界?   世界?<span id="wo8uwka" class="Apple-converted-space"> </span><br />         \         |         |       |  <span id="48s4eka" class="Apple-converted-space"> </span><br />          \       |         |         |<span id="8e4m4us" class="Apple-converted-space"> </span><br />          帐号数据?nbsp;        DBS     DBS<span id="ycyceci" class="Apple-converted-space"> </span><br /><br />  q里既然讨论C大区及帐h据库Q所以顺带也说一下关于激zd区的概念。wow中一共有八个大区Q我们想要进入某个大区游戏之前,必须到官|上Ȁz这个区Q这是ؓ什么呢Q?span class="Apple-converted-space"> </span><br /><br />  一般来_在各个大区帐h据库之上q有一个ȝ帐号数据库,我们可以U它Z心数据库。比如我们在官网上注册了一个帐Pq时帐号数据是只保存在中心数据库上的。而当我们要到一区去创徏角色开始游戏的时候,在一区的帐号数据库中q没有我们的帐号数据Q所以,我们必须先到官网上做一ơ激zL作。这个激zȝq程也就是从中心库上把我们的帐号数据拯到所要到的大区帐h据库中?span class="Apple-converted-space"> </span><br /><br /><strong>服务器结构探?-- 单的世界服实?/strong><span id="e8ikmky" class="Apple-converted-space"> </span><br /><br />  讨论了这么久我们一直都q没有进入游戏世界服务器内部Q现在就让我们来H探一下里面的l构吧?span class="Apple-converted-space"> </span><br /><br />  对于现在大多数MMORPG来说Q游戏服务器要处理的基本逻辑有移动、聊天、技能、物品、Q务和生物{,另外q有地图理与消息广播来对其他高U功能做支撑。如U队、好友、公会、战场和副本{,q些都是通过基本逻辑功能l合或扩展而成?span class="Apple-converted-space"> </span><br /><br />  在所有这些基逻辑中,与我们要讨论的服务器l构关系最紧密的当属地囄理方式。决定了地图的管理方式也决定了我们的服务器l构Q我们仍然先从最单的实现方式开始说赗?span class="Apple-converted-space"> </span><br /><br />  回想一下我们曾战斗q无C夜晚的暗黑破坏神Q整个暗黑的世界被分Z若干个独立的地图,当我们在地图间穿时Q一般都要经q一个叫做传送门的装|。世界中有些地图间虽然在地理上是直接相连的,但我们发现其游戏内部的逻辑却是完全隔离的。可以这栯为,一块地囑ְ是一个独立的数据处理单元?span class="Apple-converted-space"> </span><br /><br />  既然如此Q我们就把每块地N当作是一台独立的服务器,他提供了在这块地图上游戏时的所有逻辑功能Q至于内部结构如何划分我们暂不理会,先把他当作一个黑盒子吧?span class="Apple-converted-space"> </span><br /><br />  当两个h合作做一件事Ӟ我们可以以对{的关系怺协商着来做Q而且一般也都不会有什么问题。当人数增加C个时Q我们对{的合作关系可能会有些复杂,因ؓ我们每个人都同时要与另两个h合作协商。正如俗语所说的那样Q三个和可能会到没水喝的情况。当人数l箋增加Q情况就变得不那么简单了Q我们得需要一个管理者来Ҏ们的工作q行分工、协调。游戏的地图服务器之间也是这么回事?span class="Apple-converted-space"> </span><br /><br />  一般来_我们的游戏世界不可能会只有一块或者两块小地图Q那理成章的,也就需要一个地囄理者。先U它为游戏世界的中心服务器吧Q毕竟是理者嘛Q大安以它Z心?span class="Apple-converted-space"> </span><br /><br />  中心服务器主要维护一张地图ID到地图服务器地址的映表。当我们要进入某张地图时Q会从中心服上取得该地图的IP和port告诉客户端,客户端主动去q接Q这栯入他惌ȝ游戏地图。在整个游戏q程中,客户端始l只会与一台地图服务器保持q接Q当要切换地囄时候,在获取到新地囄地址后,会先与当前地图断开q接Q再q入新的地图Q这样保证玩家数据在服务器上只有一份?span class="Apple-converted-space"> </span><br /><br />  我们来看看结构图是怎样的:<span id="smey44o" class="Apple-converted-space"> </span><br /><br />              中心服务?span class="Apple-converted-space"> </span><br />           /       \         \<span id="ogaeges" class="Apple-converted-space"> </span><br />         /         \         \<span id="8s8io4m" class="Apple-converted-space"> </span><br />       d?nbsp;    地图1     地图2   地图n<span id="cm48ggm" class="Apple-converted-space"> </span><br />         \         |         /       /<span id="ggq44mu" class="Apple-converted-space"> </span><br />           \       |         /       /<span id="m8myi8i" class="Apple-converted-space"> </span><br />                客户?span class="Apple-converted-space"> </span><br /><br />  很简单,不是吗。但是简单ƈ不表C功能上会有什么损失,单也更不能表C游戏不能赚钱。早期不游戏也实采用的就是这U简单结构?span class="Apple-converted-space"> </span><br /><br /><strong>服务器结构探?-- l箋世界?/strong><span id="c8ce8eu" class="Apple-converted-space"> </span><br /><br />  都已l看出来了,q种每切换一ơ地囑ְ要重新连接服务器的方式实在是不够优雅Q而且在实际游戏运营中也发玎ͼ地图切换D的卡P复制装备{问题非常多Q这里完全就是一个事故多发地D,如何避免q种频繁的连接操作呢Q?span class="Apple-converted-space"> </span><br /><br />  最直接的方法就是把那个囑ր{q来p了。客L只需要连接到中心服上Q所有到地图服务器的数据都由中心服来转发。很完美的解x案,不是吗?<span id="y8q4uk4" class="Apple-converted-space"> </span><br /><br />  q种l构在实际的部v中也遇到了一些挑战。对于一般的MMORPG服务器来_单台服务器的承蝲量^均在2000左右Q如果你的服务器很不q地只能?000人,没关p,不少游戏都是如此Q如果你的服务器上跑?000多玩家依然比较流畅,那你可以自豪地告诉你的策划,多设计些大量消耗服务器资源的玩法吧Q比如大型国战、公会战争等?span class="Apple-converted-space"> </span><br /><br />  2000人,g我们的策划朋友们不大愿意接受q个数字。我们将地图服务器分开来原来也是想负载分开Q以多带些客LQ现在要所有的q接都从中心服上转发Q那q接数又遇到单台服务器的可最大承载量的瓶颈了?span class="Apple-converted-space"> </span><br /><br />  q里有必要再解释下这个数字。我知道Q有Z定会_才带2000人,那是你水q不行,我随便写个TCP服务器都可带个五六千q接。问题恰恰在于你是随便写的,而MMORPG的服务器是复杂设计的。如果一个演Csocket API用的echo服务器就能满MMOG服务器的需求,那写服务器该是g多么惬意的事啊?span class="Apple-converted-space"> </span><br /><br />  但我们所遇到的事实是Q服务器收到一个移动包后,要向周围所有hq播Q而不是echo服务器那L单的回应Q服务器在收C个连接断开通知时要向很多h通知玩家退ZӞq将该玩家的资料写入数据库,而不是echo服务器那样什么都不需要做Q服务器在收C个物品用请求包后要做一pd的逻辑判断以检查玩家有没有作弊Q服务器上还启动着很多定时器用来更新游戏世界的各种状?.....<span id="k4844ca" class="Apple-converted-space"> </span><br /><br />  其实q么一比较Q我们也看出资源消耗的所在了Q服务器上大量的复杂的逻辑处理。再回过头来看看我们惌实现的结构,我们既想要有一个唯一的入口,使得客户端不用频J改变连接,又希望这个唯一入口的负载不会太大,以致于接受不了多连接?span class="Apple-converted-space"> </span><br /><br />  仔细看一看这个需求,我们惌的仅仅只是一台管理连接的服务器,q不打算让他承担太多的游戏逻辑。既然如此,那五六千个连接也q有满我们的要求。至在现在来说Q一个游戏世界内Q也是一l服务器内同时有五六千个在线的玩家还是g让h很兴奋的事。事实上Q在大多数游戏的大部分时间里Q这个数字也是很让h眼红的?span class="Apple-converted-space"> </span><br /><br />  什么?你说梦、魔兽还有史先生的那个什么征途远不止q么点h了!噢,我说的是大多敎ͼ是大多数Q不包括那些明星。你知道大陆现在有多游戏在q营吗?或许你又该说Q我们不该在一开始就把自q目标定的太低Q好吧,我们q是先不谈这个?span class="Apple-converted-space"> </span><br /><br />  l箋我们的结构讨论。一般来_我们把这台负责连接管理的服务器称为网x务器Q因为内部的数据都要通过q个|关才能出去Q不q从q台服务器提供的功能来看Q称其ؓ反向代理服务器可能更合适。我们也不在q个名字上纠~了Q就按大安用的叫法,q是UC为网x务器吧?span class="Apple-converted-space"> </span><br /><br />  |关之后的结构我们依然可以采用之前描q的ҎQ只是,gq没有必要ؓ每一个地N开一个独立的监听端口了。我们可以试着对地图进行一些划分,׃个Master Server来管理一些更的Zone ServerQ玩安过|关q接到Master Server上,而实际与地图有关的逻辑是分z更小的Zone Serverd理?span class="Apple-converted-space"> </span><br /><br />  最后的l构看v来大概是q样的:<span id="emykmso" class="Apple-converted-space"> </span><br /><br />         Zone Server         Zone Server<span id="8qmgio8" class="Apple-converted-space"> </span><br />                 \             /<span id="kmgq88q" class="Apple-converted-space"> </span><br />                 \           /<span id="444uwey" class="Apple-converted-space"> </span><br />                 Master Server           Master Server<span id="484i4k4" class="Apple-converted-space"> </span><br />                     /       \                   /<span id="4u48q4a" class="Apple-converted-space"> </span><br />                   /         \                 /<span id="q4su4u4" class="Apple-converted-space"> </span><br />         Gateway Server         \               /<span id="8wk8w4m" class="Apple-converted-space"> </span><br />             |         \         \             /<span id="4cu444m" class="Apple-converted-space"> </span><br />             |         \         \           /<span id="ogsm8ym" class="Apple-converted-space"> </span><br />             |               Center Server<span id="wq4m44k" class="Apple-converted-space"> </span><br />             |<span id="ymoa4cs" class="Apple-converted-space"> </span><br />             |<span id="m4e8o4g" class="Apple-converted-space"> </span><br />           Client<span id="a4uwc4u" class="Apple-converted-space"> </span><br /><br /><strong>服务器结构探?-- 最l的l构</strong><span id="cu8q8mu" class="Apple-converted-space"> </span><br /><br />  如果我们此打住Q可能马上就会有嗤之以E了,p点古董的技术也敢出来现。好吧,我们q是把之前留下的问题拿出来解x吧?span class="Apple-converted-space"> </span><br /><br />  一般来_当某一部分能力达不到我们的要求Ӟ最单的解决Ҏ是在此多投入一点资源。既然想要更多的q接敎ͼ那就再加一台网x务器吧。新增加了网x后需要在大区服上做相应的支持Q或者再单点Q有一C要的|关服,当其负蝲较高Ӟd新到达的连接重定向到其他网x上?span class="Apple-converted-space"> </span><br /><br />  而对于游戏服来说Q有一台还是多台网x是没有什么区别的。每个代表客L玩家的对象内部都保留一个代表其q接的对象,消息q播时要求每个玩家对象用自qq接对象发送数据即可,至于q接是在什么地方,那是完全透明的。当Ӟq只是一U简单的实现Q也是普通用的一U方案,如果后期惛_消息q播做一些优化的话,那可能才需要多考虑一下?span class="Apple-converted-space"> </span><br /><br />  既然说到了优化,我们也稍E考虑一下现在结构下可能采用的优化方案?span class="Apple-converted-space"> </span><br /><br />  首先是当前的Zone Server要做的事情太多了Q以至于他都处理不了多少q接。这其中最消耗系l资源的当属生物的AI处理了,其是那些复杂的寻\法Q所以我们可以考虑把这部分AI逻辑独立出来Q由一台单独的AI服务器来承担?span class="Apple-converted-space"> </span><br /><br />  然后Q我们可以试着把一些与地图数据无关的公共逻辑攑ֈMaster Server上去实现Q这样Zone Server上只保留了与地图数据紧密相关的逻辑Q如生物理Q玩家移动和状态更新等?span class="Apple-converted-space"> </span><br /><br />  q有聊天处理逻辑Q这部分与游戏逻辑没有M兌Q我们也完全可以其独立出来Q放C台单独的聊天服务器上d现?span class="Apple-converted-space"> </span><br /><br />  最后是数据库了Qؓ了减L据库的压力,提高数据h的响应速度Q我们可以在数据库之前徏立一个数据库~存服务器,一些常用数据缓存在此,服务器与数据库的通信都要通过q台服务器进行代理。缓存的数据会定时的写入到后台数据库中?span class="Apple-converted-space"> </span><br /><br />  好了Q做完这些优化我们的服务器结构大体也定的差不多了,暂且也不再l深入,更细化的内容{到各个部分实现的时候再探讨?span class="Apple-converted-space"> </span><br /><br />  好比我们ȝ一场晚会,舞台上演员们按着预定的节目单有序C演着Q但q就是整场晚会的全部吗?昄不止Q在q后q有太多太多的h在忙着Q甚臛_晚会前和晚会后都有。我们的游戏服务器也如此?span class="Apple-converted-space"> </span><br /><br />  在之前描q的部分如同舞C的演员,是我们能直接看到的,q后的工作h员我们也来认识一下?span class="Apple-converted-space"> </span><br /><br />  现实中有警察来维护秩序,游戏中也如此Q这是我们常说的GM。GM可以采用跟普通玩家一L拉入方式来进入游戏,当然权限会比普通玩安一些,也可以提供一台GM服务器专门用来处理GM命oQ这样可以有更高的安全性,GM服一般接在中心服务器上?span class="Apple-converted-space"> </span><br /><br />  在以旉收费的游戏中Q我们还需要一台计费的服务器,q台服务器一般接在网x务器上,注册玩家d和退Z件以记录玩家的游戏时间?span class="Apple-converted-space"> </span><br /><br />  M为用h供服务的地方都会有日志记录,游戏服务器当然也不例外。从记录玩家d的时_地址Q机器信息到游戏q程中的每一Ҏ作都可以作ؓ日志记录下来Q以备查错及数据挖掘用。至于搜集玩家机器资料所涉及到的法律问题不是我们该考虑的?span class="Apple-converted-space"> </span><br /><br />  差不多就q么多了吧,接下来我们会按照q个大致的结构来详细讨论各部分的实现?span class="Apple-converted-space"> </span><br /><br /><strong>服务器结构探?-- 一Ҏ?/strong><span id="mg484e4" class="Apple-converted-space"> </span><br /><br />  再强调一下,服务器结构本无所谓好坏,只有是否适合自己。我们在前面探讨了一些在现在的游戏中见到q的l构Qƈ我所知地分析了各自存在的一些问题和可以做的一些改q,希望其中没有谬误Q如果能l大家也带来些启发那自然更好?span class="Apple-converted-space"> </span><br /><br />  H然发现自己一旦罗嗦v来还真是没完没了。接下来先说说我在开发中遇到q的一些困惑和一基础问题探讨吧,q些问题可能有h与我一P也曾遇到q,或者正在被困扰中,而所要探讨的q些基础问题向来也是争论比较多的Q我们也不评价其中的好与坏,只做单的描述?span class="Apple-converted-space"> </span><br /><br />  首先是服务器操作pȝQlinux与windows之争随处可见Q其实在大多数情况下q不是我们所能决定的Q似乎各大公怹基本都有了自q传统Q如|易的freebsdQ腾讯的linux{。如果真有权利去选择的话Q选自己最熟悉的吧?span class="Apple-converted-space"> </span><br /><br />  军_了OS也就基本上确定了|络IO模型Qwindows上的IOCP和linux下的epoolQ或者直接用现有的|络框架Q如ACE和asio{,其他q有些商业的|络库在国内的用好像没有见刎ͼ不符合中国国情嘛?)<span id="a44444y" class="Apple-converted-space"> </span><br /><br />  然后是网l协议的选择Q以前的选择大多們֐于UDPQؓ了可靠传输一般自己都会在上面实现一层封装,而现在更普通的是直接采用本w就很可靠的TCPQ或者TCP与UDP的؜用。早期选择UDP的主要原因还是带宽限Ӟ现在宽带普通的情况下TCP比UDP多出来的一点点开销与开发的便利性相比已l不什么了。当Ӟ如果已有了成熟的可靠UDP库,那也可以l箋使用着?span class="Apple-converted-space"> </span><br /><br />  q有消息包格式的定义Q这个曾在云风的blog上展开q激烈的争论。消息包格式定义包括三段Q包ѝ消息码和包体,争论的焦点在于应该是消息码在前还是包长在前,我们也把q个当作是信仰问题吧Q有兴趣的去云风的blog上看看,?span class="Apple-converted-space"> </span><br /><br />  另外早期有些游戏的包格式定义是以Ҏ字符作分隔的Q这样一个好处是其中某个包出现错误后我们的游戏还能l。但实际上,我觉得这是完全没有必要的Q真要出现这L错误Q直接断开q个客户端的q接可能更安全。而且Q以Ҏ字符做分隔的消息包定义还加大了一点点|络数据量?span class="Apple-converted-space"> </span><br /><br />  最后是一个纯技术问题,有关socketq接数的最大限制。开始学习网l编E的时候我犯过q样的错误,以ؓport的定义ؓunsigned shortQ所以想当然的认为服务器的最大连接数?5535Q这会是一个硬性的限制。而实际上Q一个socket描述W在windows上的定义是unsigned intQ因此要有限刉也是四十多亿Q放心好了?span class="Apple-converted-space"> </span><br /><br />  在服务器上port是监听用的,惌q样一U情况,web server?0端口上监听,当一个连接到来时Q系l会个连接分配一个socket句柄Q同时与其在80端口上进行通讯Q当另一个连接到来时Q服务器仍然?0端口与之通信Q只是分配的socket句柄不一栗这个socket句柄才是描述每个q接的唯一标识。按windows|络~程W二版上的说法,q个上限值配|媄响?span class="Apple-converted-space"> </span><br /><br />  好了Q废话说完了Q下一,我们开始进入登录服的设计吧?span class="Apple-converted-space"> </span><br /><br /><strong>d服的设计 -- 功能需?/strong><span id="8gcegwk" class="Apple-converted-space"> </span><br /><br />  正如我们在前面曾讨论q的Q登录服要实现的功能相当单,是帐号验证。ؓ了便于描qͼ我们暂不引入那些讨论q的优化手段Q先以最单的方式实现Q另外也基本以mangos的代码作为参考来q行描述?span class="Apple-converted-space"> </span><br /><br />  惌一下帐号验证的实现ҎQ最Ҏ的那是把用戯入的明文用帐号和密码直接发给d服,服务器根据帐号从数据库中取出密码Q与用户输入的密码相比较?span class="Apple-converted-space"> </span><br /><br />  q个Ҏ存在的安全隐患实在太大,明文的密码传输太Ҏ被截获了。那我们试着在传输之前先加一下密Qؓ了服务器能进行密码比较,我们应该采用一个可逆的加密法Q在服务器端把这个加密后的字串还原ؓ原始的明文密码,然后与数据库密码q行比较。既然是一个可逆的q程Q那外挂制作者L办法知道我们的加密过E,所以,q个Ҏ仍不够安全?span class="Apple-converted-space"> </span><br /><br />  哦,如果我们只是希望密码不可能被q原出来Q那q不Ҏ吗,使用一个不可逆的散列法p了。用户在d时发送给服务器的是明文的帐号和经散列后的不可逆密码串Q服务器取出密码后也用同L法q行散列后再q行比较。比如,我们q使用最q泛的md5法吧。噢Q不要管那个王小云的什么论文,如果我真有那么好的运气,早中500w了,q用在这考虑该死的服务器设计吗?<span id="ya44m44" class="Apple-converted-space"> </span><br /><br />  g是一个很完美的方案,外挂制作者再也偷不到我们的密码了。慢着Q外挂偷密码的目的是什么?是ؓ了能用我们的帐号q游戏!如果我们L用一U固定的法来对密码做散列,那外挂只需要记住这个散列后的字串就行了Q用q个做密码就可以成功d?span class="Apple-converted-space"> </span><br /><br />  嗯,q个问题好解冻I我们不要用固定的法q行散列是了。只是,问题在于服务器与客户端采用的散列法得出的字串必L相同的,或者是可验证其是否匚w的。很q运的是Q伟大的数学字们早就为我们准备好了很多优U的这cȝ法,而且l理论和实践都证明他们也实是够安全的?span class="Apple-converted-space"> </span><br /><br />  q其中之一是一个叫做SRP的算法,全称叫做Secure Remote PasswordQ即安全q程密码。wow使用的是W?版,也就是SRP6法。有兛_中的数学证明Q如果有向我解释清楚Qƈ能让我真正弄明白的话Q我非常感Ȁ。不q其代码实现步骤倒是q不复杂Qmangos中的代码也还清晎ͼ我们也不再赘q?span class="Apple-converted-space"> </span><br /><br />  d服除了帐号验证外q得提供另一功能,是在玩家的帐号验证成功后返回给他一个服务器列表让他去选择。这个列表的状态要定时hQ可能有新的游戏世界开放了Q也可能有些游戏世界非常不幸地停止运转了Q这些状态的变化都要可能及时地让玩家知道。不发生了什么事Q用户都有权利知道,特别是对于付q费的用h_我们不该藏着掖着Q不是吗Q?span class="Apple-converted-space"> </span><br /><br />  q个游戏世界列表的功能将由大区服来提供,具体的结构我们在之前也描q过Q这里暂不做讨论。登录服从大区服上获取到的游戏世界列表发给已验证通过的客L卛_。好了,d服要实现的功能就q些Q很单,是吧?span class="Apple-converted-space"> </span><br /><br />  实是太单了Q不q简单的l构正好更适合我们来看一看游戏服务器内部的模块结构,以及一些服务器共有lg的实现方法。这q作下一吧?span class="Apple-converted-space"> </span><br /><br /><strong>服务器公q件实?-- mangos的游戏主循环<span id="4m4auiq" class="Apple-converted-space"> </span><br /></strong><br />  当阅M工E的源码Ӟ我们大概会选择从main函数开始,而当开始一Ҏ的工E时Q第一个写下的函数大多也是main。那我们先来看看,游戏服务器代码实CQmain函数都做了些什么?span class="Apple-converted-space"> </span><br /><br />  ׃我在L术文章时最不喜看到的就是大D大D늚代码Q特别是那些直接Ctrl+C再Ctrl+V后未做Q何修改的代码Q用句时髦的话说Q一Ҏ术含量都没有Q所以在我们今后所要讨论的内容中,量会避免出现直接的代码Q在有些地方实需要代码来表述Ӟ也将会选择使用伪码?span class="Apple-converted-space"> </span><br /><br />  先从mangos的登录服代码开始。mangos的登录服是一个单U程的结构,虽然在数据库q接中可以开启一个独立的U程Q但q个U程也只是对无返回结果的执行cSQL做缓Ԍ而对需要有q回l果的查询类SQLq是在主逻辑U程中阻塞调用的?span class="Apple-converted-space"> </span><br /><br />  d服中唯一的这一个线E,也就是主循环U程对监听的socket做select操作Qؓ每个q接q来的客Ld其上的数据ƈ立即q行处理Q直到服务器收到SIGABRT或SIGBREAK信号时结束?span class="Apple-converted-space"> </span><br /><br />  所以,mangosd服主循环的逻辑Q也包括后面游戏服的逻辑Q主循环的关键代码其实是在SocketHandler中,也就是那个Select函数中。检查所有的q接Q对新到来的q接调用OnAcceptҎQ有数据到来的连接则调用OnReadҎQ然后socket处理器自己定义对接收到的数据如何处理?span class="Apple-converted-space"> </span><br /><br />  很简单的l构Q也比较Ҏ理解?span class="Apple-converted-space"> </span><br /><br /><br />  只是Q在Ҏ能要求比较高的服务器上Qselect一般不会是最好的选择。如果我们用windowsq_Q那IOCP是首选;如果是linuxQepool是不二选择。我们也不打讨论基于IOCP或是Zepool的服务器实现Q如果仅仅只是要实现服务器功能,很简单的几个API调用卛_Q而且|上已有很多好的教程Q如果是要做一个成熟的|络服务器品,不是我几简单的技术介l文章所能达到?span class="Apple-converted-space"> </span><br /><br />  另外Q在服务器实CQ网lIO与逻辑处理一般会攑֜不同的线E中Q以免耗时较长的IOq程d住了需要立卛_应的游戏逻辑?span class="Apple-converted-space"> </span><br /><br />  数据库的处理也类|会用异步的方式Q也是避免耗时的查询过E将游戏服务器主循环d住。想象一下,因某个玩家上U而发L一ơ数据库查询操作D服务器内所有在U玩安卡住不动是多么恐怖的一件事Q?span class="Apple-converted-space"> </span><br /><br />  另外q有一些如事g、脚本、消息队列、状态机、日志和异常处理{公qӞ我们也会在接下来的时间里q行探讨?span class="Apple-converted-space"> </span><br /><br /><strong>服务器公q件实?-- l箋来说d@?span class="Apple-converted-space"> </span><br /></strong><br />  前面我们只简单了解了下mangosd服的E序l构Q也发现了一些不之处,现在我们来看看如何提供一个更好的Ҏ?span class="Apple-converted-space"> </span><br /><br />  正如我们曾讨的,Z游戏主逻辑循环的流畅运行,所有比较耗时的IO操作都会分n到单独的U程中去做,如网lIOQ数据库IO和日志IO{。当Ӟ也有把这些分享到单独的进E中d的?span class="Apple-converted-space"> </span><br /><br />  另外对于大多数服务器E序来说Q在q行旉是作为精灵进E或服务q程的,所以我们ƈ不需要服务器能够处理控制台用戯入,我们所要处理的数据来源都来自网l?span class="Apple-converted-space"> </span><br /><br />  q样Q主逻辑循环所要做的就是不停要取消息包来处理,当然q些消息包不仅有来自客户端的玩家操作数据包,也有来自GM服务器的理命oQ还包括来自数据库查询线E的q回l果消息包。这个@环将一直持l,直到收到一个通知服务器关闭的消息包?span class="Apple-converted-space"> </span><br /><br />  主逻辑循环的结构还是很单的Q复杂的部分都在如何处理q些消息包的逻辑上。我们可以用一D늮单的伪码来描q这个@环过E:<span id="48ae4kg" class="Apple-converted-space"> </span><br /><br />    while (Message* msg = getMessage())<span id="86u44ec" class="Apple-converted-space"> </span><br />    {<span id="w44gi44" class="Apple-converted-space"> </span><br />      if (msg为服务器关闭消息)<span id="kkegioe" class="Apple-converted-space"> </span><br />        break;<span id="k8w8qaq" class="Apple-converted-space"> </span><br />      处理msg消息;<span id="4w4u8a4" class="Apple-converted-space"> </span><br />    }<span id="ako8k4u" class="Apple-converted-space"> </span><br /><br />  q里有一个问题需要探讨了Q在getMessage()的时候,我们应该d里取消息Q前面我们考虑q,臛_会有三个消息来源Q而我们还讨论q,q些消息源的IO操作都是在独立的U程中进行的Q我们这里的ȝE不应该直接去那几处消息源进行阻塞式的IO操作?span class="Apple-converted-space"> </span><br /><br />  很简单,让那些独立的IOU程在接收完数据后自己送过来就是了。好比是Q我q里提供了一个仓库,有很多的供货商,他们有货要给我的时候只需要交C库,然后我再C库去取就是了Q这个仓库也是消息队列。消息队列是一个普通的队列实现Q当然必要提供多线E互斥访问的安全性支持,其基本的接口定义大概cMq样Q?span class="Apple-converted-space"> </span><br /><br />    IMessageQueue<span id="oqse8e8" class="Apple-converted-space"> </span><br />    {<span id="4844844" class="Apple-converted-space"> </span><br />      void putMessage(Message*);<span id="88au4g8" class="Apple-converted-space"> </span><br />      Message* getMessage();<span id="yi8wge8" class="Apple-converted-space"> </span><br />    }<span id="ismou4w" class="Apple-converted-space"> </span><br /><br />  |络IOQ数据库IOU程把整理好的消息包都加入到主逻辑循环U程的这个消息队列中便返回。有x息队列的实现和线E间消息的传递在ACE中有比较完全的代码实现及描述Q还有一些用示例,是个很好的参考?span class="Apple-converted-space"> </span><br /><br />  q样的话Q我们的d@环就很清CQ从ȝE的消息队列中取消息Q处理消息,再取下一条消?.....<span id="wgis8ka" class="Apple-converted-space"> </span><br /><br /><strong>服务器公q件实?-- 消息队列</strong><span id="kau844w" class="Apple-converted-space"> </span><br /><br />  既然说到了消息队列,那我们l来E微多聊一点吧?span class="Apple-converted-space"> </span><br /><br />  我们所能想到的最单的消息队列可能是使用stl的list来实CQ即消息队列内部l护一个list和一个互斥锁QputMessage时将message加入到队列尾QgetMessage时从队列头取一个messageq回Q同时在getMessage和putMessage之前都要求先获取锁资源?span class="Apple-converted-space"> </span><br /><br />  实现虽然单,但功能是l对满需求的Q只是性能上可能稍E有些不如人意。其最大的问题在频J的锁竞争上?span class="Apple-converted-space"> </span><br /><br />  对于如何减少锁竞争次数的优化ҎQGhost Cheng提出了一U。提供一个队列容器,里面有多个队列,每个队列都可固定存放一定数量的消息。网lIOU程要给逻辑U程投递消息时Q会从队列容器中取一个空队列来用,直到该队列填满后再攑֛容器中换另一个空队列。而逻辑U程取消息时是从队列容器中取一个有消息的队列来dQ处理完后清I队列再攑֛到容器中?span class="Apple-converted-space"> </span><br /><br />  q样便得只有在寚w列容器进行操作时才需要加锁,而IOU程和逻辑U程在操作自己当前用的队列旉不需要加锁,所以锁竞争的机会大大减了?span class="Apple-converted-space"> </span><br /><br />  q里为每个队列设了个最大消息数Q看来好像是打算只有当IOU程写满队列时才会将其放回到容器中换另一个队列。那q样有时也会出现IOU程未写满一个队列,而逻辑U程又没有数据可处理的情况,特别是当数据量很时可能会很Ҏ出现。Ghost Cheng在他的描qC没有讲到如何解决q种问题Q但我们可以先来看看另一个方案?span class="Apple-converted-space"> </span><br /><br />  q个Ҏ与上一个方案基本类|只是不再提供队列容器Q因为在q个Ҏ中只使用了两个队列,arthur在他的一邮件中描述了这个方案的实现及部分代码。两个队列,一个给逻辑U程读,一个给IOU程用来写,当逻辑U程d队列后会自q队列与IOU程的队列相调换。所以,q种Ҏ下加锁的ơ数会比较多一些,IOU程每次写队列时都要加锁Q逻辑U程在调换队列时也需要加锁,但逻辑U程在读队列时是不需要加锁的?span class="Apple-converted-space"> </span><br /><br />  虽然看v来锁的调用次数是比前一U方案要多很多,但实际上大部分锁调用都是不会引vd的,只有在逻辑U程调换队列的那一瞬间可能会得某个线E阻塞一下。另外对于锁调用q程本n来说Q其开销是完全可以忽略的Q我们所不能忍受的仅仅是因ؓ锁调用而引Ld而已?span class="Apple-converted-space"> </span><br /><br />  两种Ҏ都是很优U的优化方案,但也都是有其适用范围的。Ghost Cheng的方案因为提供了多个队列Q可以得多个IOU程可以dE师的,互不q扰的用自q队列Q只是还有一个遗留问题我们还不了解其解决Ҏ。arthur的方案很好的解决了上一个方案遗留的问题Q但因ؓ只有一个写队列Q所以当惌提供多个IOU程ӞU程间互斥地写入数据可能会增大竞争的ZQ当Ӟ如果只有一个IOU程那将是非常完的?span class="Apple-converted-space"> </span></span></p> <p><span style="text-align: left; widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; border-collapse: separate; font: 12px/18px Arial; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><span id="aiueca4" class="Apple-converted-space"><span style="text-align: left; widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; border-collapse: separate; font: 12px/18px Arial; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px" class="Apple-style-span"><strong>服务器公q件实?-- 环Ş~冲?/strong><span id="kuw8isi" class="Apple-converted-space"> </span><br /><br />  消息队列锁调用太频繁的问题算是解决了Q另一个让人有些苦恼的大概是这太多的内存分配和释放操作了。频J的内存分配不但增加了系l开销Q更使得内存片不断增多Q非怸利于我们的服务器长期E_q行。也许我们可以用内存池Q比如SGI STL中附带的内存分配器。但是对于这U按照严格的先进先出序处理的,块大ƈ不算的Q而且块大也q不l一的内存分配情冉|_更多使用的是一U叫做环形缓冲区的方案,mangos的网l代码中也有q么一个东西,其原理也是比较简单的?span class="Apple-converted-space"> </span><br /><br />  好比两个h围着一张圆形的桌子在追逐,跑的|络IOU程所控制Q当写入数据Ӟq个人就往前跑Q追的h是逻辑U程Q会一直往前追直到q上跑的人。如果追上了怎么办?那就是没有数据可MQ先{会儿呗Q等跑的人向前跑几步了再q,M能让游戏没得玩了吧。那要是q的的太慢,跑的{了一圈过来反q上q的Z呢?那您也先歇会儿吧。要是一直这么反着q,估计您就只能换一个跑的更快的q逐者了Q要不这游戏q真没法玩下厅R?span class="Apple-converted-space"> </span><br /><br />  前面我们特别了,按照严格的先q先出顺序进行处理,q是环Ş~冲区的使用必须遵守的一要求。也是Q大安得遵守规定,q的Z能从桌子上跨q去Q跑的h当然也不允许反过来跑。至于ؓ什么,不需要多做解释了吧?span class="Apple-converted-space"> </span><br /><br />  环Ş~冲区是一很好的技术,不用频繁的分配内存,而且在大多数情况下,内存的反复用也使得我们能用更少的内存块做更多的事?span class="Apple-converted-space"> </span><br /><br />  在网lIOU程中,我们会ؓ每一个连接都准备一个环形缓冲区Q用于时存放接收到的数据,以应付半包及_包的情c在解包及解密完成后Q我们会这个数据包复制到逻辑U程消息队列中,如果我们只用一个队列,那这里也会是个环Ş~冲区,IOU程往里写Q逻辑U程在后面读Q互相追逐。可要是我们使用了前面介l的优化Ҏ后,可能q里便不再需要环形缓冲区了,臛_我们q不再需要他们是环Ş的了。因为我们对同一个队列不再会出现同时d写的情况Q每个队列在写满后交l逻辑U程去读Q逻辑U程d后清I队列再交给IOU程dQ一D固定大的~冲区即可。没关系Q这么好的技术,在别的地方一定也会用到的?span class="Apple-converted-space"> </span><br /><br /><strong>服务器公q件实?-- 发包的方?/strong><span id="eq8m44c" class="Apple-converted-space"> </span><br /><br />  前面一直都在说接收数据时的处理ҎQ我们应该用专门的IOU程Q接收到完整的消息包后加入到ȝE的消息队列Q但是主U程如何发送数据还没有探讨q?span class="Apple-converted-space"> </span><br /><br />  一般来说最直接的方法就是逻辑U程什么时候想发数据了q接调用相关的socket API发送,q要求服务器的玩家对象中保存其连接的socket句柄。但是直接send调用有时候有会存在一些问题,比如遇到pȝ的发送缓冲区满而阻塞住的情况,或者只发送了一部分数据的情况也时有发生。我们可以将要发送的数据先缓存一下,q样遇到未发送完的,在逻辑U程的下一ơ处理时可以接着再发送?span class="Apple-converted-space"> </span><br /><br />  考虑数据~存的话Q那q里q可以有两种实现方式了,一是ؓ每个玩家准备一个缓冲区Q另外就是只有一个全局的缓冲区Q要发送的数据加入到全局~冲区的时候同时要指明q个数据是发到哪个socket的。如果用全局~冲区的话,那我们可以再q一步,使用一个独立的U程来处理数据发送,cM于逻辑U程Ҏ据的处理方式Q这个独立发送线E也l护一个消息队列,逻辑U程要发数据时也只是把数据加入到q个队列中,发送线E@环取包来执行send调用Q这时的d也就不会寚w辑U程有Q何媄响了?span class="Apple-converted-space"> </span><br /><br />  采用W二U方式还可以附带一个优化方案。一般对于广播消息而言Q发送给周围玩家的数据都是完全相同的Q我们如果采用给每个玩家一个缓冲队列的方式Q这个数据包需要拷贝多份,而采用一个全局发送队列时Q我们只需要把q个消息入队一ơ,同时指明该消息包是要发送给哪些socket的即可。有兌优化的说明在云风描述其连接服务器实现的blog文章中也有讲刎ͼ有兴的可以去阅M下?span class="Apple-converted-space"> </span><br /><br /><strong>服务器公q件实?-- 状态机</strong><span id="cc8qm84" class="Apple-converted-space"> </span><br /><br />  有关State模式的设计意囑֏实现׃从设计模式中摘抄了,我们只来看看游戏服务器编E中如何使用State设计模式?span class="Apple-converted-space"> </span><br /><br />  首先q是从mangos的代码开始看P我们注意到登录服在处理客L发来的消息时用到了这样一个结构体Q?span class="Apple-converted-space"> </span><br /><br />  struct AuthHandler<span id="8ecm8s4" class="Apple-converted-space"> </span><br />  {<span id="yam4syo" class="Apple-converted-space"> </span><br />    eAuthCmd cmd;<span id="ac4qq84" class="Apple-converted-space"> </span><br />    uint32 status;<span id="w8gkq84" class="Apple-converted-space"> </span><br />    bool (AuthSocket::*handler)(void);<span id="y8kuoec" class="Apple-converted-space"> </span><br />  };<span id="48seqwu" class="Apple-converted-space"> </span><br /><br />  该结构体定义了每个消息码的处理函数及需要的状态标识,只有当前状态满求时才会调用指定的处理函敎ͼ否则q个消息码的出现是不合法的。这个status状态标识的定义是一个宏Q有两种有效的标识,STATUS_CONNECTED和STATUS_AUTHEDQ也是未认证通过和已认证通过。而这个状态标识的改变是在q行时进行的Q确切的说是在收到某个消息ƈ正确处理完后改变的?span class="Apple-converted-space"> </span><br /><br />  我们再来看看设计模式中对State模式的说明,其中关于State模式适用情况里有一条,当操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态,q个状态通常用一个或多个枚D变量表示?span class="Apple-converted-space"> </span><br /><br />  描述的情况与我们q里所要处理的情况是如此的怼Q也许我们可以试一试。那再看看State模式提供的解x案是怎样的,State模式每一个条件分支放入一个独立的cM?span class="Apple-converted-space"> </span><br /><br />  ׃q里的两个状态标识只区分Z两种状态,所以,我们仅需要两个独立的c,用以表示两种状态即可。然后,按照State模式的描qͼ我们q需要一个Contextc,也就是状态机理c,用以理当前的状态类。稍作整理,大概的代码会cMq样Q?span class="Apple-converted-space"> </span><br /><br />  状态基cL口:<span id="egqkeai" class="Apple-converted-space"> </span><br />  StateBase<span id="ey8moms" class="Apple-converted-space"> </span><br />  {<span id="g4qkcsi" class="Apple-converted-space"> </span><br />    void Enter() = 0;<span id="4eq8uiy" class="Apple-converted-space"> </span><br />    void Leave() = 0;<span id="y84cu44" class="Apple-converted-space"> </span><br />    void Process(Message* msg) = 0;<span id="48i8msi" class="Apple-converted-space"> </span><br />  };<span id="4usm846" class="Apple-converted-space"> </span><br /><br />  状态机基类接口Q?span class="Apple-converted-space"> </span><br />  MachineBase<span id="m4w4i4s" class="Apple-converted-space"> </span><br />  {<span id="kuo8448" class="Apple-converted-space"> </span><br />    void ChangeState(StateBase* state) = 0;<span id="oq4o8m4" class="Apple-converted-space"> </span><br /><br />    StateBase* m_curState;<span id="8augyg4" class="Apple-converted-space"> </span><br />  };<span id="q8ic8i4" class="Apple-converted-space"> </span><br /><br />  我们的逻辑处理cM从MachineBasezQ当取出数据包后交给当前状态处理,前面描述的两个状态类从StateBasezQ每个状态类只处理该状态标识下需要处理的消息。当要进行状态{换时Q调用MachineBase的ChangeState()ҎQ显C地告诉状态机理c自p转到哪一个状态。所以,状态类内部需要保存状态机理cȝ指针Q这个可以在状态类初始化时传入。具体的实现l节׃做过多描qC?span class="Apple-converted-space"> </span><br /><br />  使用状态机虽然避免了复杂的判断语句Q但也引入了新的ȝ。当我们在进行状态{换时Q可能会需要将一些现场数据从老状态对象{Ud新状态对象,q需要在定义接口时做一下考虑。如果不希望执行拯Q那么这里公有的现场数据也可攑ֈ状态机cMQ只是这样在使用时可能就不那么优雅了?span class="Apple-converted-space"> </span><br /><br />  正如同在设计模式中所描述的,所有的模式都是已有问题的另一U解x案,也就是说qƈ不是唯一的解x案。放到我们今天讨论的State模式中,拿d服所处理的两个状态来_也许用mangos所采用的遍历处理函数的Ҏ可能更简单,但当pȝ中的状态数量增多,状态标识也变多的时候,State模式显得尤光要了?span class="Apple-converted-space"> </span><br /><br />  比如在游戏服务器上玩家的状态管理,q有在实现NPC人工时的各种状态管理,q些q作以后的专题吧?span class="Apple-converted-space"> </span><br /><br /><strong>服务器公q?-- 事g与信?/strong><span id="ewqkmsi" class="Apple-converted-space"> </span><br /><br />关于q一节,q几天已l打了好几遍草稿Q总觉得说不清楚,也不好组l这些内容,但是打铁要趁热,为避免热情消退Q先整理一点东西放q,好l下面的主题Q以后如果有Z再回来完善吧。本节内Ҏ考虑Q希望大家多l点意见?span class="Apple-converted-space"> </span><br /><br />有些cM于QT中的event与signalQ我一些动作请求消息定义ؓ事gQ而将状态改变消息定义ؓ信号。比如在QT应用E序中,用户的一ơ鼠标点M产生一个鼠标点M件加入到事g队列中,当处理此事g时可能会D某个按钮控g产生一个clicked()信号?span class="Apple-converted-space"> </span><br /><br />对应到我们的服务器上的一个例子,玩家d时会发给服务器一个请求登录的数据包,服务器可其当作一个用L录事Ӟ该事件处理完后可能会产生一个用户已d信号?span class="Apple-converted-space"> </span><br /><br />q样Q与QTcMQ对于事件我们可以重定义其处理方法,甚至qo掉某些事件其不被处理,但对于信h们只是收C一个通知Q有些类gObserve模式中的观察者,当收到更新通知Ӟ我们只能更新自己的状态,对刚刚发生的事g我不已不能做M影响?span class="Apple-converted-space"> </span><br /><br />仔细来看Q事件与信号其实q无多大差别Q从我们对其需求上来说Q都只要能注册事件或信号响应函数Q在事g或信号生时能够被通知到即可。但有一区别在于,事g处理函数的返回值是有意义的Q我们要Ҏq个q回值来定是否q要l箋事g的处理,比如在QT中,事g处理函数如果q回trueQ则q个事g处理已完成,QApplication会接着处理下一个事Ӟ而如果返回falseQ那么事件分zևCl箋向上L下一个可以处理该事g的注册方法。信号处理函数的q回值对信号分派器来说是无意义的?span class="Apple-converted-space"> </span><br /><br />单点_是我们可以Z件定义过滤器Q得事件可以被qo。这一功能需求在游戏服务器上是到处存在的?span class="Apple-converted-space"> </span><br /><br />关于事g和信h制的实现Q网l上的开源训也比较多Q比如FastDelegateQsigslotQboost::signal{,其中sigslotq被Google采用Q在libjingle的代码中我们可以看到他是如何被用的?span class="Apple-converted-space"> </span><br /><br />在实C件和信号机制时或许可以考虑用同一套实玎ͼ在前面我们就分析q,两者唯一的区别仅在于q回值的处理上?span class="Apple-converted-space"> </span><br /><br />另外q有一个需要我们关注的问题是事件和信号处理时的优先U问题。在QT中,事g因ؓ都是与窗口相关的Q所以事件回调时都是从当前窗口开始,一U一U向上派发,直到有一个窗口返回trueQ截断了事g的处理ؓ止。对于信L处理则比较简单,默认是没有顺序的Q如果需要明的序Q可以在信号注册时显C地指明槽的位置?span class="Apple-converted-space"> </span><br /><br />在我们的需求中Q因为没有窗口的概念Q事件的处理也与信号cMQ对注册q的处理器要按某个顺序依ơ回调,所以优先的设|功能是需要的?span class="Apple-converted-space"> </span><br /><br />最后需要我们考虑的是事g和信L处理方式。在QT中,事g使用了一个事仉列来l护Q如果事件的处理中又产生了新的事Ӟ那么新的事g会加入到队列,直到当前事g处理完毕后,QApplication再去队列头取下一个事件来处理。而信L处理方式有些不同Q信号处理是立即回调的,也就是一个信号生后Q他上面所注册的所有槽都会立即被回调。这样就会生一个递归调用的问题,比如某个信号处理器中又生了一个信P会得信L处理像一|一L展开。我们需要注意的一个很重要的问题是会不会引起@环调用?span class="Apple-converted-space"> </span><br /><br />关于事g机制的考虑其实q很多,但都是一些不成熟的想法。在上面的文字中同时出C消息、事件和信号三个相近的概念,而在实际处理中,l常发现三者不知道如何界定的情况,实际的情冉|我在q里描述的要混ؕ的多?span class="Apple-converted-space"> </span><br /><br />q里也就当是挖下一个坑Q希望能够有所交流?span class="Apple-converted-space"> </span><br /><br /><strong>再谈d服的实现</strong><span id="84mq4wy" class="Apple-converted-space"> </span><br /><br />    L们的d服实现已l太q了Q先拉回来一下?span class="Apple-converted-space"> </span><br />   <span id="gi8u4s8" class="Apple-converted-space"> </span><br />    关于d服、大区服及游戏世界服的结构之前已做过探讨Q这里再把各自的职责和关pd一下?span class="Apple-converted-space"> </span><br /><br />        GateWay/WorldServer   GateWay/WodlServer LoginServer LoginServer DNSServer WorldServerMgr<span id="i8akwu8" class="Apple-converted-space"> </span><br />                |                     |                     |                 |            |<span id="s8a4mki" class="Apple-converted-space"> </span><br />      ---------------------------------------------------------------------------------------------<span id="sse844u" class="Apple-converted-space"> </span><br />                                             | | |<span id="ceoauso" class="Apple-converted-space"> </span><br />                                             internet<span id="s4mo848" class="Apple-converted-space"> </span><br />                                                |<span id="8ue4gu4" class="Apple-converted-space"> </span><br />                                              clients<span id="sc44y4m" class="Apple-converted-space"> </span><br /><br />    其中DNSServer负责带负载均衡的域名解析服务Q返回LoginServer的IP地址l客L。WorldServerMgrl护当前大区内的世界服列表,LoginServer会从q里取世界列表发l客L。LoginServer处理玩家的登录及世界服选择h。GateWay/WorldServer为各个独立的世界服或者通过|关q接到后面的世界服?span class="Apple-converted-space"> </span><br /><br />    在mangos的代码中Q我们注意到d服是从数据库中取的世界列表,而在wow官方服务器中Q我们却会注意到Q这个世界服列表q不是一开始就固定Q而是动态生成的。当每周一ơ的l护完成之后Q我们可以很明显的看到这个列表生成的q程。刚开始时Q世界列表是I的Q慢慢的Q世界服会一个个加入q来Q而这里如果有世界服当机,他会昄为离U,不会从列表中删除。但是当下一ơ服务器再维护后Q所有的世界服都不存在了Q全部重新开始添加?span class="Apple-converted-space"> </span><br /><br />    从上面的q程描述中,我们很容易想到利用一个时的列表来保存世界服信息Q这也是我们增加WorldServerMgr服务器的目的所在。GateWay/WorldServer在启动时会自动向WorldServerMgr注册自己Q这样就把自己所代表的游戏世界添加到世界列表中了。类似的Q如果DNSServer也可以让LoginServer自己L册,q样在时LoginServer时就不需要去改动DNSServer的配|文件了?span class="Apple-converted-space"> </span><br /><br />    WorldServerMgr内部的实现很单,监听一个固定的端口Q接受来自WorldServer的主动连接,q检其状态。这里可以用一个心跛_来实现其状态的,如果WorldServer的连接断开或者在规定旉内未收到心蟩包,则将其状态更Cؓȝ。另外WorldServerMgrq处理来自LoginServer的列表请求。由于世界列表ƈ不常变化Q所以LoginServer没有必要每次发送世界列表时都到WorldServerMgr上去取,LoginServer完全可以自己l护一个列表,当WorldServerMgr上的列表发生变化ӞWorldServerMgr会主动通知所有的LoginServer也更C下自q列表。这个或许就可以用前面描q过的事件方式,或者就是观察者模式了?span class="Apple-converted-space"> </span><br /><br />    WorldServerMgr实现所要考虑的内容就q些Q我们再来看看LoginServerQ这才是我们今天要重点讨论的对象?span class="Apple-converted-space"> </span><br /><br />    前面探讨一些服务器公共lgQ那我们q里也应该试用一下,不能只是停留在理Z。先从状态机开始,前面也说q了Q登录服上的q接会有两种状态,一是帐号密码验证状态,一是服务器列表选择状态,其实q有另外一个状态我们未曾讨Q因为它与我们的dq程q无多大关系Q这是升包发送状态。三个状态的转换程大致为:<span id="as4yui8" class="Apple-converted-space"> </span><br /><br />        LogonState -- 验证成功 -- 版本?-- 版本低于最新?-- 转到UpdateState<span id="gikcywk" class="Apple-converted-space"> </span><br />                                          |<span id="a844wek" class="Apple-converted-space"> </span><br />                                           -- 版本{于最新?-- 转到WorldState<span id="ic8gs8o" class="Apple-converted-space"> </span><br /><br />    q个版本查的和决定下一个状态的q程是在LogonState中进行的Q下一个状态的选择是由当前状态来军_。密码验证的q程使用了SRP6协议Q具体过E就不多做描qͼ每个游戏使用的方式也都不大一栗而版本检查的q程更无值得探讨的东西,一个if-else卛_?br /><br />    升状态其实就是文件传输过E,文g发送完毕后通知客户端开始执行升U文件ƈ关闭q接。世界选择状态则提供了一个列表给客户端,其中包括了所有游戏世界网x务器的IP、PORT和当前负载情c如果客L一直连接着Q则该状态会以每5U一ơ的频率不停h列表l客LQ当然是否值得q样做还是有待商榗?span class="Apple-converted-space"> </span><br /><br />    整个q程g都没有值得探讨的内容,但是Q还没有完。当客户端选择了一个世界之后该怎么办?wow的做法是Q当客户端选择一个游戏世界时Q客L会主动去q接该世界服的IP和PORTQ然后进入这个游戏世界。与此同Ӟ与登录服的连接还没有断开Q直到客L实q接上了选定的世界服q且走完了排队过Eؓ止。这是一个很必要的设计,保证了我们在因意外情况连接不上世界服或者发C界服正在排队而想换另外一个试试时不会需要重新进行密码验证?span class="Apple-converted-space"> </span><br /><br />    但是我们所要关注的q不是这些,而是客户端去q接游戏世界的网x时服务器该如何识别我们。打个比方,有个不自觉的玩家不遵守游戏规则,没有去验证帐号密码就直接跑去q接世界服了Q就如同一个不自觉的乘客没有换L牌就直接跑到L口一栗这Ӟ乘务员会客气地告诉你要先换登机牌Q那L牌又从哪来?口换的Qh家会先验明你的n份,认后才会发l你L牌。一L处理q程Q我们的d服在验明客户端n份后Q也会发l客L一个登机牌Q这个登机牌q有一个学名,叫做session key?span class="Apple-converted-space"> </span><br /><br />    客户端拿着q个session keyM界服|关处就可正登录了吗?gq是有个疑问Q他怎么知道我这个key是不是造假的?没办法,中国的假货太多,我们不得不到处都考虑假货的问题。方法很单,Ll他L牌的那个员问一下,q张牌是不是他发的不得了。可是,那么多的LoginServerQ要一个个问下来,q效率也太低了,后面排的镉K一定会开始叫唤了。那么,LoginServer这个key存到数据库中Q让|关服自己去数据库验证?g也是个可行的Ҏ?span class="Apple-converted-space"> </span><br /><br />    如果觉得q样l数据库带来了太大的压力的话Q也可以考虑cMWorldServerMgr的做法,用一个时的列表来保存,甚至可以这个列表就保存到WorldServerMgr上,他正好是全区唯一的。这两种Ҏ的本质ƈ无差别,只是看你愿意负载放在哪里。而不在哪里Q这个查询的压力都是有点大的Q想惻I全区所有玩家呢。所以,我们也可以试着考虑一U新的方案,一U不需要去全区唯一一个入口查询的Ҏ?span class="Apple-converted-space"> </span><br /><br />    那我们将q些session key分开存储不就得了。一个可行的Ҏ是,让Q意时d有一个地方保存一个客L的session keyQ这个地方可能是客户端当前正q接着的服务器Q也可以是它正要去连接的服务器。让我们来详l描qC下这个过E,客户端在LoginServer上验证通过ӞLoginServer为其生成了本ơ会话的session keyQ但只是保存在当前的LoginServer上,不会存数据库Q也不会发送给WorldServerMgr。如果客Lq时惌L个游戏世界,那么他必d通知当前q接的LoginServer要去的服务器地址QLoginServersession key安全转移l目标服务器Q{Uȝ意思是要确保目标服务器收到了session keyQ本C存的要删除掉。{UL功后LoginServer通知客户端再去连接目标服务器Q这时目标服务器在验证session key合法性的时候就不需要去别处查询了,只在本地保存的session key列表中查询即可?span class="Apple-converted-space"> </span><br /><br />    当然了,Zsession key的安全,所有的服务器在收到一个新的session key后都会ؓ其设一个有效期Q在有效期过后还没来认证的,则该session key会被自动删除。同Ӟ所有服务器上的session key在连接关闭后一定会被删除,保证一个session key真正只ؓ一ơ连接会话服务?span class="Apple-converted-space"> </span><br /><br />    但是Q很昄的,wowq没有采用这U方案,因ؓ客户端在选择世界服时q没有向服务器发送要求确认的消息。wow中的session key应该是保存在一个类gWorldServerMgr的地方,或者如mangos一P是保存在了数据库中。不是怎样一U方式,了解了其q程Q代码实现都是比较简单的Q我们就不再赘述了?span class="Apple-converted-space"> </span></span></span></span></p></span></span><img src ="http://www.shnenglu.com/Husiwa/aggbug/156625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Husiwa/" target="_blank">IT菜鸟</a> 2011-09-23 18:21 <a href="http://www.shnenglu.com/Husiwa/archive/2011/09/23/156625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>链表的小题目http://www.shnenglu.com/Husiwa/archive/2011/09/06/155215.htmlIT菜鸟IT菜鸟Tue, 06 Sep 2011 09:33:00 GMThttp://www.shnenglu.com/Husiwa/archive/2011/09/06/155215.htmlhttp://www.shnenglu.com/Husiwa/comments/155215.htmlhttp://www.shnenglu.com/Husiwa/archive/2011/09/06/155215.html#Feedback0http://www.shnenglu.com/Husiwa/comments/commentRss/155215.htmlhttp://www.shnenglu.com/Husiwa/services/trackbacks/155215.html

1、倒{单链?/p>

     非递归?/p>

    

  1. struct Node  
  2. {  
  3.   int data;  
  4.   Node * next;  
  5. }  
  6. void reverse(Node*& head) {  
  7.   if (head == NULL) {  
  8.      return;  
  9.   }  
  10.   Node * pre, * cur, * nxt;  
  11.   pre = head;  
  12.   cur = head -> next;  
  13.   while (cur != NULL) {  
  14.      pre = cur -> next;  
  15.      pre = cur;  
  16.      cur = nxt;  
  17.      nxt = nxt -> next;  
  18.   }  
  19.   head -> next = NULL;  
  20.   head = pre;  
  21. }  
 

 

 

     递归?/p>

    

  1. Node * reverse(Node * node, Node *&head)  
  2. {  
  3.      if (node == NULL || node -> next == NULL) {  
  4.          head = node;  
  5.          return;  
  6.      }  
  7.      else {  
  8.         Node * nxt = reverse(node -> next, head)  
  9.         node = nxt -> next;  
  10.         return node;  
  11.      }  
  12. }  
  13. 最后要返回的node的next域设为NULL?nbsp; 

 

 

2、找出倒数Wk个元?或中间元素)Q设|快慢指?br />
3、删除环状单链表的一个节点,只给定指向要删除节点的指?/p>

     思\Q无法获取前一个指针,那么可删除下一个节点,交换当前节点和下一个节点的值即?br />
4、两个有序链表的合ƈ

     归ƈ卛_

 

5、判断单链表是否有环Q环首?

     是否有环Q快慢指针,如果盔RQ说明存在环

     环首Q可先求出环ѝ一个圆内的q及问题Q两ơ相遇时慢指针走q的距离即环长;

              此时假设慢指针已Ci步,则快指针已走?i步;两个指针同时倒退i步的位置Q慢指针退到链首,快指针退到i处,则从q两个位|vQ指针各走i步既能在环内盔R?/p>

              于是可设|两个指针,一个在N处,一个在i处,步长?Q第一ơ相遇的节点即ؓ环首的位|?/p>

 

6、如何判断两个链表是否交叉?如果扑ֈ交叉点?
     思\?



IT菜鸟 2011-09-06 17:33 发表评论
]]>
þ޹Ʒ123| ۺϾþþþۺ| þþþþþۺۺϺݺ| þþþ޾ƷĻ| ҹŷƷþþþþþ| þùӾƷŮ| þþþֻоƷ| 97þþþ޾Ʒר| ĻӰӾþþѹۿ| www.þþƷ| þþƷþþþùۿ99ˮ | ƷþƷ| þ޹վ| þۺϾɫۺϾ99| aѹۿþav| þþþþþùѿ| þùȾƷҰAV| þùۺϾƷ| þþƷAV鶹 | ޹˾þþƷ99| þùƷ99þþþþ| Ʒþþþþ³| ھƷ˾þþþվ| þúݺݸ߳޾Ʒ| þøŮ߳MBA| ҹƷþþþþӰ777| ҹҹþ| ŷ˾þƬ| vĻþ| þۺ97ɫֱ| þþƷĻ| þѴƬ| þƬѹۿ| þþƷѴƬƬ| 99þùۺϾƷˮ| þþþëƬ| þþþ뾫Ʒ| þAvԴվ| þˬˬAV| ޺ݺۺϾþþþ| ɫۺϾþ|