??xml version="1.0" encoding="utf-8" standalone="yes"?>久久99国产精品99久久,97精品国产97久久久久久免费,久久不见久久见免费视频7http://www.shnenglu.com/Fox/category/5794.html游戏人生 != ( 人生 == 游戏 )zh-cnMon, 19 May 2008 13:56:21 GMTMon, 19 May 2008 13:56:21 GMT60~程之美Q一摞烙饼的排序Q未完成Q?/title><link>http://www.shnenglu.com/Fox/archive/2008/04/20/flapjack_sortting.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Sun, 20 Apr 2008 06:59:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2008/04/20/flapjack_sortting.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/47659.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2008/04/20/flapjack_sortting.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/47659.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/47659.html</trackback:ping><description><![CDATA[<p>Author: Fox</p> <p>首先声明Q本人没有解xq个问题?/p> <p>相比W一?a href="http://www.shnenglu.com/Fox/archive/2008/04/17/control_cpu_using_curve.html" target=_blank>让CPU占用率曲U听你指?/a>对Windowspȝ中CPU占有率概늚考察和对API的用,以及W二?a href="http://www.shnenglu.com/Fox/archive/2008/04/18/chinese_chess_one_param.html" target=_blank>中国象棋帅问题</a>Ҏ象徏模的考察?a target=_blank>q道题目</a>才算是一道算法题吧?之前那两道尤其是<a href="http://www.shnenglu.com/Fox/archive/2008/04/18/chinese_chess_one_param.html" target=_blank>中国象棋帅问题</a>L点脑{急{弯的味道?/p> <p>题目Q?font color=#800000>星期五的晚上Q一帮同事在希格玛大厦附q的“盘酒吧”多喝了几杯。程序员多喝了几杯之后谈什么呢Q自然是法问题。有个同事说Q?/font></p> <p><font color=#800000>“我以前在馆打工Q顾客经常点非常多的烙饼。店里的饼大不一Q我习惯在到N客饭桌前Q把一摞饼按照大小ơ序摆好——小的在上面Q大的在下面。由于我一只手托着盘子Q只好用另一只手Q一ơ抓住最上面的几块饼Q把它们上下颠倒个个儿Q反复几ơ之后,q摞烙饼排好序了?/font> <p><font color=#800000>我后来想Q这实际上是个有的排序问题Q假设有<em>n</em>块大不一的烙|那最要dơ,才能辑ֈ最后大有序的l果呢?</font> <p><font color=#800000>你能否写Z个程序,对于<em>n</em>块大不一的烙|输出最优化的翻DE呢Q?/font></p> <p>排序问题是数据结构和法中比较重要的一个了Q之前在<a href="http://www.shnenglu.com/Fox/archive/2008/03/20/unwisdom_or_impavidity.html" target=_blank>一被同事成ؓ标题党的文章</a>中因为提到排序中关于Q非Q稳定排序的概念q被很多TX鄙视了一番,甚至引来ndQ现在想来都有些后怕?/p> <p>q道题目一眼看上去最先让我想到的居然是那道经典的<a target=_blank>汉诺塔(Tower of HanoiQ?/a>问题Q当Ӟ<a target=_blank>汉诺?/a>不算排序问题Q?/p> <p><font color=#800000>1) 怼点★Q?/font></p> <p>a. 都要不断调整位置Q最l实C到大排好;</p> <p>b. 都要借助中间量进行调整?/p> <p><font color=#800000>2) 不同处★Q?/font></p> <p>a. 汉诺塔有多出来的两根针,ȝ饼只有一只手Q明说明没有第三只手;</p> <p>b. 汉诺塔一ơ只能移动一个,ȝ饼没限制Q?/p> <p>c. 汉诺塔要保证的始终在上面,ȝ饼没限制Q?/p> <p>d. 汉诺塔移动之前就有序Q所以其Udơ数是固定的Q算法的逻辑也固定(不管是递归q是栈操作)Q翻烙饼没有q个前提?/p> <p><font color=#800000>3) 把题目用E序语言描述一下吧★:</font></p> <p>a. Input : <em>n</em>.</p> <p>b. Process : generate <em>n</em> random number 0-(n-1), sortting.</p> <p>c. Output : 0, 1, ..., n-1, and move times <em>num</em>.</p> <p><font color=#800000>4) 存储l构★★★:</font></p> <p>我最开始想到的是:q一摞烙饼其实就是一个双链表Q每Mơ相当于头节点H与某非头节点Nq行如下变换Q?/p> <p>H->next = N->next</p> <p>N->prior = H->prior = NULL</p> <p>N->next->prior = H</p> <p>如果使用普通的双链表,q儿有一个很明显的问题,H和N之间的所有节点(如果有的话)?font color=#800000>前趋prior和后lnext互换</font>了,对于<em>n</em>比较大的情况Q这个操作明显浪Ҏ间啊Q?font color=#800000>交换前趋prior和后lnext和题目要求的dơ似乎也没有关系?/font>Q只是我作ؓ一个一U的Coder考虑的太具体了)。如果摒弃前和后的概念,又该怎样描述呢?</p> <p><a target=_blank>唐朝宗大师青原行?/a>曾说Q?font color=#800000><strong>参禅之初Q看山是山,看水是水Q禅有悟Ӟ看山不是山,看水不是_中LQ看׃然山Q看水仍然是?/strong></font>?/p> <p>俗:日,扯那么多Q什么意思? <p>师:前趋不是前趋Q后l不是后l? <p>俗:日,前趋不是前趋Q难道是后吗? <p>师:然也? <p><font color=#800000><strong>FoxQO, my GodQ整点实际的吧!{一ơ之后,前趋视ؓ后Q后l视为前,W奇数次{的前是后Q第偶数ơ翻转的后是前?/strong></font> <p>整个链表的Ş态如下:</p> <p>H:Head, F:First, G:F's next, B:C's prior, C:Change, D, C's next, L:Last.</p> <p>H<==>F<==>G<=...=>B<==>C<==>D<=...=>L</p> <p>F与C交换的操作如下(Word、PSdQ,n表示nextQp表示priorQ?/p> <p align=center><img src="http://lh3.ggpht.com/yulefox/SAnuzSRgEtI/AAAAAAAAAMg/EFmsyGW5lWw/s800/flapjack_before_cross.jpg"> </p> <p align=center><img src="http://lh3.ggpht.com/yulefox/SAnuySRgEsI/AAAAAAAAAMY/ncke8G_JIXo/s800/flapjack_after_cross.jpg%22" src_cetemp='http://lh3.ggpht.com/yulefox/SAnuySRgEsI/AAAAAAAAAMY/ncke8G_JIXo/s800/flapjack_after_cross.jpg"'> </p> <p>q里只需要修?font color=#800000>F、D节点的priorQH、C节点的next</font>Q其他节点不变?/p> <p>后面想了一下,q种方式很难在不dflag或者对换n、p的情况下正常操作Q没有找到好的方?span style="FONT-FAMILY: wingdings">L</span>Q?font color=#800000><strong>如果你有好的Ҏ不妨告诉?/strong></font>?/p> <p>最后只好作|,何苦呢?直接使用数组完了嘛<span style="FONT-FAMILY: wingdings">J</span>Q既然是数组Q除了翻转移动麻烦一点,理解和操作还是很Ҏ的?/p> <p>果然不是搞数学、算法出w的Q一上来考虑的就是如何存储^.^''''Q而不是算法本w?/p> <p><strong><font color=#800000>更可W的是,扯了半天Q最后居然还是用数组</font></strong>Q?/p> <p><font color=#800000>5) 法分析★★★★★:</font></p> <p><strong><font color=#800000>冒排序思想Q?/font></strong></p> <p>最关键的是要抽象出<strong>随机数列特征</strong>Q含当前和移动后数列特征的抽象)Qƈ量使每一ơ翻?strong>有效</strong>Q所?strong>有效</strong>Q即量保证每一ơ操作都向最后的有序靠近而非背离 Q?/p> <p>师:要大头在后Q应使大头在后?/p> <p>俗:日,q是什么狗屁逻辑Q?/p> <p>师:因果。在前既是在后?/p> <p>俗:USA, CNNQ操你娘Q?/p> <p>师:{。既不在前,也不在后Q之在前,使之在后?/p> <p>俗:日,什么东西?既不在前Q也不在后,不前不后Q难道在中间啊?</p> <p>师:然也?/p> <p><strong><font color=#800000>FoxQO, my GodQ整点实际的吧!整个q程分ؓn轮,在第i(i=0, 1, ..., n-1)轮:</font></strong></p> <p>a. 扑ֈ大头<em><strong>n-i</strong></em>Q是否有序?是,转gQ?/p> <p>b. 是否大头在后Q是Q{fQ?/p> <p>c. 是否大头在前Q是Q{eQ?/p> <p>d. 队_W一个元素)与大?strong><em>n-i</em></strong>对调Q别忘了是翻转,中间元素也变序了Q,++<strong><em>times</em></strong>Q?/p> <p>e. 队?strong><em>n-i</em></strong>与第n-i个元素对调,++<strong><em>times</em></strong>Q?/p> <p>f. ++<strong><em>i</em></strong>Q{aQ?/p> <p>g. 输出序列Q?, 1, ..., nQ和{ơ数<strong><em>times</em></strong>QOVER:D?/p> <p><strong><font color=#800000>快速排序思想Q?/font></strong></p> <p>在最开始的时候,我就惛_使用快速排序的思想Q先使整个数列局部有序,最后调整全部有序?strong><font color=#800000>悲哀的是Q在我考虑 4 3 1 2q个数列的时候,我断定还要通过上面的方式重新像冒排序一样重新来q,立即攑ּxQ于是给了上面的思\Q而且坚定的认个方法已l很?/font></strong>。结果,下午GR告诉我他的反例:<font color=#800000><strong>4 3 1 2 --> 2 1 3 4|--> 1 2| 3 4</strong></font>Q?#8220;|”表示从该处翻转?/p> <p>我必L认,q才是好的方法,我过分拘泥于不去改动已经有序的部分。然而,q家伙只知道反驳我,却无法给出算法?/p> <p>我只好自己重新考虑局部有序之后的问题?/p> <p>十分钟后Q我有了如下的答案(<strong><font color=#800000>目前我能惛_的最佳答?/font></strong>Q,但不得不承认Q?strong><font color=#800000>表述法比给ZU情况对应的解要ȝ的多的多的多</font></strong>Q假定A、B满<strong><font color=#800000>A==B-1</font></strong>Q即A、B为相L列(为简单记Q元素和数列l称数列Q。则A、B的组合类型有8U:<strong>B(O)A(O)、B(C)A(O)、B(O)A(C)、B(C)A(C)、A(C)B(O)、A(O)B(O)、A(C)B(C)、A(O)B(C)</strong>QO表示正向QobverseQC表示逆向QreverseQ,? 2 3 4ZQ?/p> <p><font color=#800000><font color=#000000><strike>B(O)A(O)Q? 4 1 2<2></strike>?/font>B(C)A(O)Q? 3 1 2<4><font color=#000000>?/font><strong>B(O)A(C)Q? 4 2 1</strong><5></font>、B(C)A(C)Q? 3 2 1<7>Q?/p> <p><font color=#800000><font color=#000000><strike>A(C)B(C)Q? 1 4 3<1></strike>?/font>A</font><font color=#800000>(O)B(C)Q? 2 4 3<3><font color=#000000>?/font><strong>A(C)B(O)Q? 1 3 4</strong><6></font><font color=#000000>、A(O)B(O)Q? 2 3 4<8>?/font></p> <p>对应操作规则如下Q?/p> <p><strike>a. 0x0101: B(O)A(O) --> B(C)A(O)Q?3</strike></p> <p>b. 0x0001: B(C)A(O) --> A(C)B(O)Q?2</p> <p><font color=#800000>c. 0x0101: B(O)A(C) --> <strong>B(C)A(C)</strong>Q?</font></p> <p>d. 0x0000: B(C)A(C)Q?strong>如果当前只剩A、B两个子列</strong>Q则{一ơ成<strong><font color=#800000>A(O)B(O)1 2 3 4为最l结?/font></strong>Q否则,认ؓ<strong><font color=#800000>B(C)A(C)</font></strong>可以<strong>作ؓ一个逆序有序数列考虑</strong>Q暂时无需{Q?/p> <p><strike>e. 0x1010: A(C)B(C) --> A(O)B(C)Q?3</strike></p> <p>f. 0x1110: A(O)B(C) --> B(O)A(C)Q?nbsp; 2</p> <p><font color=#800000>g. 0x1011: A(C)B(O) --> <strong>A(O)B(O)</strong>Q?</font></p> <p>h. 0x1111: A(O)B(O)QA、B可以<strong>作ؓ一个有序数列考虑</strong>Q?strong>如果当前只有A、B两个子列</strong>Q则正序序列<strong><font color=#800000>A(O)B(O)1 2 3 4为最l结?/font></strong>?/p> <p>上面规则的制定其实是<strong>反向导出</strong>的,遵@的原则是Q正序有序的<strong><font color=#800000>A(O)B(O)</font></strong>和逆序有序?strong><font color=#800000>B(C)A(C)</font></strong>可以看作一个序列,A(C)B(O)、B(O)A(C)可一步达刎ͼB(C)A(O)、A(O)B(C)可两步达刎ͼB(O)A(O)、A(C)B(C)可三步达到。即对于4个元素,<strong>最坏的的A(C)B(C)需??/strong>Q对应于上面?font color=#800000>冒法却只需??/font><span style="FONT-FAMILY: wingdings">L</span>Q。而且当元素比较多的时候,C1?个有序子列是可行的,但对于完全无序的数列Q分析出所有有序子列,既不现实Q也无必要?/p> <p>修改规则如下Q?font color=#800000>?strong>队头无序</strong>&&<strong>盔R数列有序</strong>||<strong>队头有序</strong>Q翻转队_否则Q将队头q同该元素一同翻?/font>?/p> <p>由此可见Q这法q要改进Q?/p> <p>a. 判断<strong><em>Array</em>[0]</strong>是否正序q箋Q连l个?strong><em>nNum1</em></strong>Q,如果<em><strong>nNum1</strong></em>==<strong><em>n</em></strong>Q{iQ如?strong><em>nNum1</em></strong>!=1Q{cQ?/p> <p>b. 判断<strong><em>Array</em>[0]</strong>是否逆序q箋Q连l个?strong><em>nNum1</em></strong>Q,如果<em><strong>nNum1</strong></em>==<strong><em>n</em></strong>Q翻?strong><em>Array</em></strong>Q{fQ?/p> <p>c. 从下?strong><em>nNum1</em></strong>开始查?strong><em>Array</em>[0]</strong>+1Q?em><strong>bObserve</strong></em> = trueQ和<strong><em>Array</em>[0]-</strong>1Q?em><strong>bObserve</strong></em> = falseQ的下标<strong><em>nStart2</em></strong>Q如?strong><em>nNum1</em></strong>==<strong><em>nStart2</em></strong>Q?strong><em>bOrder1</em></strong>==trueQ{eQ如?strong><em>nNum1</em></strong>!=1Q置<strong><em>nEnd2</em></strong>=<strong><em>nStart2</em></strong>Q?/p> <p>d. 判断( <em><strong>bObserve</strong></em> == true&&<strong><em>Array</em>[nStart2]</strong>+1<strong>==<em>Array</em>[nStart2+1] </strong>) || ( <em><strong>bObserve</strong></em> == false&&<strong><em>Array</em>[nStart2]==<em>Array</em>[nStart2+1]</strong>+1 )Qtrue则置<strong><em>nEnd2</em></strong>=<strong><em>nStart2</em></strong>Qfalse则置<strong><em>nEnd2</em></strong>=<strong><em>nStart2</em></strong>+1Q?/p> <p>e. {<strong>Array[0]</strong> to <strong>Array[nEnd2]</strong>Q{aQ?/p> <p>f. 输出<strong>Array</strong>?strong>times</strong>?/p> <p>q样来看Q改q后的算法竟<strong>?/strong>了许多!</p> <p>不幸的是Q按上面l出的算法翻转合q? 3 5 6 4 8 7 9 2 0Q?/p> <p><font color=#800000>1 3 5 6 4 8 7 9| </font><font color=#008000>2|</font> 0</p> <p><font color=#800000>2 9 7 8 4 6 5|</font> <font color=#008000>3|</font> 1 0</p> <p><font color=#800000>3 5 6|</font> <font color=#008000>4|</font> 8 7 9 2 1 0</p> <p><font color=#800000>4 6|</font> <font color=#008000>5|</font> 3 8 7 9 2 1 0</p> <p><font color=#800000><strong>5 6</strong>|</font> 4 3 8 7 9 2 1 0</p> <p><font color=#800000>6 5 4 3 8|</font> <font color=#008000>7|</font> 9 2 1 0</p> <p><font color=#800000>7 8 3 4 5|</font> <font color=#008000>6|</font> 9 2 1 0</p> <p>q入d@环了……</p> <p>很明昑ֺ该是下面q个样子Q?/p> <p><font color=#800000>1 3 5 6 4 8 7 9 2|</font> 0</p> <p><font color=#800000>9 8 7 4 6 5|</font> 3 1 2 0</p> <p><font color=#800000>5 6 4|</font> 7 8 9 3 1 2 0</p> <p><font color=#800000>6 5 4 7|</font> 8 9 3 1 2 0</p> <p><font color=#800000>4 5 6 7 8 9 3|</font> 1 2 0</p> <p><font color=#800000>3 4 5 6 7 8 9 1 2|</font> 0</p> <p><font color=#800000>1 9 8 7 6 5 4 3 2|</font> 0</p> <p><font color=#800000>2 3 4 5 6 7 8 9 1|</font> 0</p> <p><font color=#800000>9 8 7 6 5 4 3 2 1 0|</font></p> <p><font color=#008000><strong>0 1 2 3 4 5 6 7 8 9</strong></font></p> <p>执行9ơ翻转。算法如何得到呢Q?/p> <p>a. 定最无序完整子?strong><em>Sn</em></strong>Q?strong><em>Sn</em></strong>中含<strong><em>n</em></strong>>1个连l数Q;</p> <p>b. ?strong><em>Sn</em></strong>最前面的有序子?strong><em>So</em></strong>Q?strong><em>o</em></strong>>1Q加以考虑Q一个子集?两个子集Q?/p> <p>______________________________________________________________________________</p> <p><strong><font color=#800000>O, my God!</font></strong></p> <p>q个问题Q从前天晚上到现在,思考、分析、抽象了臛_?5个小时以上了Q?/p> <p>a. Apr.18th-19th: 23:00 - 01:30</p> <p>b. Apr.19th: 11:00 - 13:00</p> <p>c. Apr.19th-20th: 22:00 - 05:30</p> <p>d. Apr.20th: 11:00 - 15:00</p> <p>l果是,到现在无法给Z个最优的{法。一个周末都花在q上面了Q?strong><font color=#800000>准备攑ּ</font></strong><span style="FONT-FAMILY: wingdings">L</span>?/p> <p><a target=_blank>LP</a>催着我让我回学校Q是该回MQ?/p><img src ="http://www.shnenglu.com/Fox/aggbug/47659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2008-04-20 14:59 <a href="http://www.shnenglu.com/Fox/archive/2008/04/20/flapjack_sortting.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何产生随机?/title><link>http://www.shnenglu.com/Fox/archive/2008/04/15/random_number_generator.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Tue, 15 Apr 2008 06:01:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2008/04/15/random_number_generator.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/47118.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2008/04/15/random_number_generator.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/47118.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/47118.html</trackback:ping><description><![CDATA[<p>Author: Fox</p> <p> <a target="_blank">John von Neumann</a>_<font color="#800000">Any one who considers arithmetical methods of producing random digits is , of course, in a state of sin.</font></p> <p>所以,在讨论算法实现随机数的时候,L说?font color="#800000">伪随机数</font>”?/p> <p>现在Q应用最q的随机数生成算法是?a target="_blank">Derrick Henry Lehmer</a>1951q给出的<a target="_blank">U性同余法</a>Q?/p> <p>              Xn+1 = ( aXn + c ) mod m,  n>=0.</p> <p>?a href="/Fox/archive/2008/04/03/mmorpg_security_prng.html" target="_blank">上一伪随机数的</a>中,q没有给出X0, a, c, m的取D则,只是l出?a target="_blank">ANSI C</a>?a target="_blank">Microsoft Visual C++</a>的实现?/p> <p>在这儿我们可以自己先思考一下,我们期望从上式中得到的随机数应该满Q?/p> <p> </p> <p>1) 上式的输够随机,q是最基本的要求;</p> <p>2) 上式l出量多的输出Q越接近m个越好(不可能超qmQ,卛_期尽量长Q最好ؓmQ这h能保证上式满?font color="#800000">均匀分布</font>Q?strike>m个数在周期m中各出现一?/strike>m个数出现的概率相{)Q?/p> <p>3) 上式的生成速度_快?/p> <p>最Ҏ惛_的,<font color="#800000">m的取gؓ计算机字大小Q如2^32?^64Q?/font>?/p> <p>但是q儿有个很严重的问题Q?font color="#800000">Xn低位的随机性很?/font>。原因如下:</p> <p>令d|m, ?/p> <p>              Yn = Xn mod d</p> <p>?/p> <p>              Yn+1 = ( ( aXn + c ) mod m ) mod d</p> <p>                      = ( aYn + c ) mod d</p> <p>上述表达式的意义卻IYn为Xn低k位(d=2^kQ,q样?font color="#800000">Yn序列形成周期为d甚至更短的同余序?/font>。D例说明:d?^1ӞYn为Xn的最低位Q可假定??Q,若Yn+1 != YnQ则Yn+2 == Yn必定成立Q仅当a、c皆ؓ奇数时Yn、Yn+1??交替Q否则,为常敎ͼ0?Q?/p> <p>暂时抛开随机性不,先找到周期ؓm的随机序列中的取D则?/p> <p> <a >Donald Knuth</a>?i>The Art of Computer Programming</i>, Volume 2: <em>Seminumerical Algorithms</em>中的<em>3.2.1.2</em>节对m, a, c和X0取D则的表述Q?/p> <p>1) gcd(c, m) = 1. ?font color="#800000">c, m互素</font>Q再白一点,c, m?之外没有其他公因子;</p> <p>2) ȝ质数p, p|m ==> p|(a-1). 即m%p==0Q则(a-1)%p==0?/p> <p>3) 4|m ==> 4|(a-1). 即m%4==0Q则(a-1)%4==0?/p> <p>q个证明q程对于我这L<font color="#800000"><a target="_blank">数论</a>基础</font>不是很扎实的搞应用技术的人来说有炚w以理解了。有兴趣的话Q还是去?em>3.2.1.2</em>的证明吧:-)?/p> <p>上面的规则告诉我们,满了上q规则后Q可以保证序列周期ؓm。对于前面提到的关于随机性的问题Q既然Xn低位的随机性比较弱Q可以只?font color="#800000">Xn的高?/font>作ؓ输出。高位的<font color="#800000">随机性和l计意义</font>由a, c定Q其取值涉?font color="#800000">l计?/font>Q具体的也还是看<em>3.3</em>吧?/p> <p>q篇文章解决?font color="#800000">hl计意义的随机数</font>的部分理论问题?/p> <p>PS: <a href="/Fox/archive/2008/03/06/mmorpg_net_iocp.html" target="_blank">之前曄BSqWindows Live Writer</a>Q当时觉得Writer~辑功能太少Q?span style="COLOR: #800000">不能直接讑֮链接文字的字体颜?/span>Q知道CSS可以讑֮之后Q又觉得Word 2007~辑的Blog转成html之后太大Q而且也知道Word 2007上面是可以设|链接的target为_blank的。现在发现Writerq是很不错的了,原来?font color="#800000">可以讑֮格式</font>的,也可以直接编辑htmlQ而且可以Web预览Q链接还可以加入?font color="#800000">链接词汇?/font>Q挺方便的?/p> <p>来发?a target="_blank">Wikipedia</a>是个?a target="_blank">Google</a>一L好东西!</p><img src ="http://www.shnenglu.com/Fox/aggbug/47118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2008-04-15 14:01 <a href="http://www.shnenglu.com/Fox/archive/2008/04/15/random_number_generator.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>|络游戏安全思考——伪随机数篇http://www.shnenglu.com/Fox/archive/2008/04/03/mmorpg_security_prng.htmlFoxFoxWed, 02 Apr 2008 18:35:00 GMThttp://www.shnenglu.com/Fox/archive/2008/04/03/mmorpg_security_prng.htmlhttp://www.shnenglu.com/Fox/comments/46126.htmlhttp://www.shnenglu.com/Fox/archive/2008/04/03/mmorpg_security_prng.html#Feedback13http://www.shnenglu.com/Fox/comments/commentRss/46126.htmlhttp://www.shnenglu.com/Fox/services/trackbacks/46126.htmlAuthor: Fox

一、随机数

软g实现?span style="COLOR: #800000">随机数生成器(random number generator, RNG)生成的随机数列大多是惟定数列Q因此一般被UC伪随机数(pseudorandom number, PRN)Q而基?span style="COLOR: #800000">热噪?thermal noise)?span style="COLOR: #800000">光电效应(photoelectric effect)?span style="COLOR: #800000">攑ְ性衰?radioactive disintegration){不可预知的物理现象实现?span style="COLOR: #800000">g随机数生成器(hardware random number generator)生成的随机数才被认ؓ?span style="COLOR: #800000">真随机数(truly random number)。PRN在计机领域主要用于仿真(simulation)和密码学(cryptography)?/span>

本文仅讨Z随机数Y件实现算法,q且仅讨论满?span style="COLOR: #800000">均匀分布(uniform distribution, UD)的伪随机数发生器(pseudorandom number generator, PRNG)?span style="COLOR: #800000">非均匀分布(non-uniform distribution, NUD)的PRNG可通过满均匀分布的PRNG与非U性函数生成?/p>

本文讨论的PRNG应满以下三点:

a. 在取值空间内满UDQ即{概率取得取值空间内L倹{?/p>

b. 充分随机Q即该随机数列周?period)应尽量长。此点由所谓的?entropy)度量?/p>

c. 唯一输入或称U子(seed)对应唯一输出PRN。这一点ms是计机的强,也是PRN惟定的根源,也是法被破解的Ҏ?/p>

׃PRN sequence(PRNS)惟定Q所以算法的安全性主要取决于늚选择和算法的复杂?/span>?/p>

二、可预测PRNG与不可预PRNG

所?span style="COLOR: #800000">可预?determined)PRNGQ也被称为统计意义上的PRNG(statistic PRNG)Q一般只有一个seedQ而对于同一个seedQ生成的PRNS是惟定的?/p>

不可预测(indetermined)PRNGQ从理论上讲Q不可预的PRNG是不存在的,q儿指密码学安全的PRNG(cryptographically secure PRNG, CSPRNG)?/p>

三、常用PRNGs

1?span style="COLOR: #800000">U性同余发生器(linear congruential generators, LCG)

单博?/a>?a target="_blank">标准库rand()函数的缺陷以及Blitz++随机数生成的?/a>中给ZThe C Programming Langurage 2nd的实玎ͼ我手头没有这本书Q所以无从查证,FallHunter应该q有吧?/p>

 1 unsigned  int  next  =   1 ;
 2
 3 /*  rand: return pseudo-random integer on 0..32767  */
 4 int  rand( void )
 5 {
 6  next  =  next  *   1103515245   +   12345 ;
 7   return  (unsigned  int )(next / 65536 %   32768 ;
 8 }

 9
10 /*  srand: set seed for rand()  */
11 void  srand(unsigned  int  seed)
12 {
13  next  =  seed;
14 }

VS2003中给的实现是Q?/p>

 1 /* **
 2 *rand.c - random number generator
 3 *
 4 *       Copyright (c) Microsoft Corporation. All rights reserved.
 5 *
 6 *Purpose:
 7 *       defines rand(), srand() - random number generator
 8 *
 9 ****************************************************************************** */

10
11 #include  < cruntime.h >
12 #include  < mtdll.h >
13 #include  < stddef.h >
14 #include  < stdlib.h >
15
16 #ifndef _MT
17 static   long  holdrand  =   1L ;
18 #endif   /* _MT */
19
20 /* **
21 *void srand(seed) - seed the random number generator
22 *
23 *Purpose:
24 *       Seeds the random number generator with the int given.  Adapted from the
25 *       BASIC random number generator.
26 *
27 *Entry:
28 *       unsigned seed - seed to seed rand # generator with
29 *
30 *Exit:
31 *       None.
32 *
33 *Exceptions:
34 *
35 ****************************************************************************** */

36
37 void  __cdecl srand (
38         unsigned  int  seed
39         )
40 {
41 #ifdef _MT
42
43         _getptd() -> _holdrand  =  (unsigned  long )seed;
44
45 #else   /* _MT */
46         holdrand  =  ( long )seed;
47 #endif   /* _MT */
48 }

49
50
51 /* **
52 *int rand() - returns a random number
53 *
54 *Purpose:
55 *       returns a pseudo-random number 0 through 32767.
56 *
57 *Entry:
58 *       None.
59 *
60 *Exit:
61 *       Returns a pseudo-random number 0 through 32767.
62 *
63 *Exceptions:
64 *
65 ****************************************************************************** */

66
67 int  __cdecl rand (
68          void
69         )
70 {
71 #ifdef _MT
72
73         _ptiddata ptd  =  _getptd();
74
75          return ( ((ptd -> _holdrand  =  ptd -> _holdrand  *   214013L
76              +   2531011L >>   16 &   0x7fff  );
77
78 #else   /* _MT */
79          return (((holdrand  =  holdrand  *   214013L   +   2531011L >>   16 &   0x7fff );
80 #endif   /* _MT */
81 }


2?span style="COLOR: #800000">LFG, LFSR{?/span>

限于幅Q有兴趣的TX可以参考后面的资料Q主要是WikipediaQ上面给的算法还是非常详l的QCSPRNGs包括Blum Blum Shub、Fortuna{?/p>

如果Z安全性的考虑QPRNG的输Z应直接作为种子。在?span style="COLOR: #800000">构徏安全的Y?/span>》一书中Q作者认为?span style="COLOR: #800000">一个好的PRNGhq样的性质Q给_的熵Q即使攻击者知道全部的法l节Q还是不能猜出生成的数据?/span>”?/p>

三、PRNG的安全测?/p>

FIPS-140标准包含了对RNs的测试规范。这个标准我也没有去仔细看,所以没法给出更多的信息。被提到的测试包?span style="COLOR: #800000">DIEHARD、pLab?/p>

四、随机数在游戏中的应?/p>

1?span style="COLOR: #800000">随机Cؓ游戏带来更多的不定性,不确定性生可玩?/span>

q个应该是所有游戏的Ҏ了吧。游戏中玩家、怪物、NPC的很多属性都是一个范_比如d有最攻d最大攻击,每次的实际攻Mxd二者之间?/p>

同样的,玩家乐此不疲的一ơ次“洗装备”、“碰q气”。其他类推吧?/p>

2?span style="COLOR: #800000">游戏的AI更多的依赖于随机?/span>

如果怪物、NPC的AI一切尽在玩家的掌握中,游戏的乐就大大降低了,q一点在单机游戏中有着很好的体现。War3中,人机ҎQ电脑的战术q不单一Q但q是有规律可循,人类玩家且如此Q,q其中固然有多方?的因素。但随机数的功劳也不Ҏ杀?/p>

3?span style="COLOR: #800000">随机数减数据存储,一个种子可以代替一Ҏ?/span>

游戏中含有大量数据,如果每一w要存取,Ҏ间和I间都是一个考验。对于场景中随机生成的怪物信息Q如果给定一个相同的U子。呃Q是不是要简单一些呢Q?/p>

五、相兛_?/p>

至于Z么PRNGs大多使用素数Q需要更多的数论知识Q对密码学有了解的TX应该能够体会?span style="COLOR: #800000">安全和数?/span>之间的紧密联pR因为手头没有数论的书,所以不多加妄测了。到时写论文的时候,再填充上吧?/p>

六、参考文?/p>

1. 构徏安全的Y? []John Viega, Gary McGraw. 钟向? 王鹏 ?  北京. 清华大学出版C? 2003.

2. Pseudorandom number generator及相关链? http://en.wikipedia.org/wiki/Pseudorandom_number_generator

3. PRNG - Pseudo-Random Number Generator. http://statmath.wu-wien.ac.at/prng/

-------------------------------------------------------------------------

PS01Q手上的几本?/p>

从几位TX那儿拿的几本书,攑֜桌上大半q了Q一直没有怎么过。想惛_末还l他们算了,于是拿q来ȝQ立此存照,如果以后用到的话Q再来查?/p>

a. ?span style="COLOR: #800000">用TCP/IPq行|际互联》Vol. IIIQ主要是针对Linux/POSIX套接字的C/S架构实现。因为MMORPG的C/S架构多依赖于TCPQ上面第8?0-16章的内容可以x一下?/p>

b. ?span style="COLOR: #800000">构徏安全的Y?/span>》,上面关于开源、闭源的口水(Chap. 4)Q关于缓冲区溢出(Chap. 7)Q关于随机数(Chap. 10)Q关于数据库安全(Chap. 14)Q关于客L安全(Chap. 15)Q都是值得一看的东西?/p>

c. ?span style="COLOR: #800000">UNIX环境高~程》,q程控制(Chap. 8)、线E控?Chap. 12)、进E通信(Chap. 15, 17)、套接字(Chap. 16)、数据库(Chap. 20)?/p>

d. ?span style="COLOR: #800000">UNIX|络~程》Vol.IQ如果涉及到泛UNIX操作pȝ下网l编E,可以当作参考书R?/p>

e. ?span style="COLOR: #800000">计算机安全原?/span>》,加密(Chap. 5)、认?Chap. 6)、协议安?Chap. 7)、入侉|?Chap. 13)、恶意攻?Chap. 15)、灾难恢?Chap. 19)?/p>

PS02Q?a target="_blank">微Y宣布不会抬高收购Yahooh

消息来自Wall Street JournalQ不q当天可?span style="COLOR: #800000">April Fool?/p>

PS03Q关?a target="_blank">Wikipedia

不是?a target="_blank">Wikipedia被禁的吗Q很久没有访问过了,q么好的东西Q被了q是很遗憄?/p>

PS04Q有问题

发现问题Q找GoogleQ解决问题,?a target="_blank">Wikipedia?/p>

PS05Q欢q补?/p>

-------------------------------------------------------------------------

Added on Apr.10th

今天?a >CodeProject上看C文?a >Applied Crypto++: Pseudo Random Number Generators)Q作?font color="#a52a2a">Jeffrey Walton对密码学和安全比较有研究?/p>

Jeffrey Walton对Knuth?a >The Art of Computer Programming Vol.2中关于随机数的部分作了概括?/p>

q篇文章从一?font color="#a52a2a">工程师的角度l出了随机数的应用和实现Q很h参考性?/p>

作者还?a >FIPS 140-2标准中引用了下面一D话Q?/p>

Random Number Generators fall into one of two classes: deterministic and nondeterministic. A deterministic RNG consists of an algorithm that produces a sequence of bits from an initial value called a seed. A nondeterministic RNG produces output that is dependent on some unpredictable physical source that is outside human control.

q一D话很好的说明,依赖于算法的RNG所生成的随机数列只可能是伪随机敎ͼ真随机数依赖于不可预的物理?/font>?/p>

Fox 2008-04-03 02:35 发表评论
]]>
MMORPG|络模型剖析——网l连接实例分?/title><link>http://www.shnenglu.com/Fox/archive/2008/03/28/mmorpg_network_impl_analysis.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Thu, 27 Mar 2008 17:41:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2008/03/28/mmorpg_network_impl_analysis.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/45569.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2008/03/28/mmorpg_network_impl_analysis.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/45569.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/45569.html</trackback:ping><description><![CDATA[<p> <span style="COLOR: black; FONT-FAMILY: 宋体">Author: Fox </span> </p> <p> <span style="FONT-FAMILY: 宋体"> <span style="COLOR: black">在以前写</span> <a href="/Fox/archive/2007/12/16/game_world_architecture.html" target="_blank">MMORPG中游戏世界的构徏</a> <span style="COLOR: black">Ӟ提到服务器架构的分类。大多数情况下,每一U不同的服务器只会与其对应的一个服务器和多个客L通信。比如,GameServer(GS)只会与WorldServer(WS)通信Q也是说GS只作为WS的客L。这ơ,׃目需求,新增加了一个SomeServer(SS)作ؓGS的服务器?</span> </span> </p> <p> <span style="COLOR: #c00000; FONT-FAMILY: 宋体">一、SS|络q接分析 </span> </p> <p> <span style="FONT-FAMILY: 宋体"> <span style="COLOR: black">׃需要和大量GS建立|络q接Q所以SS使用了IOCP模型。鉴?/span> <a href="/Fox/archive/2008/03/06/mmorpg_net_iocp.html" target="_blank">上一ơ写IOCP</a> <span style="COLOR: black">旉?/span> <a href="/kevinlynx/" target="_blank">Kevin</a> <span style="COLOR: black">TX的鄙视,所以决定今天多写一炏VSS的网l模型大致如下: </span> </span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">0、服务器ȝE启动; </span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">1、初始化WinsockQSDK func: WSAStartup ()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">2、创Z个用overlapped I/O的socketQSDK func: WSASocket()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">3、绑定端口,本地地址与创建的socket兌hQSDK func: bind()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">4、创建IOCP对象QSDK func: CreateIoCompletionPort()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">5、创建工作者线E,CreateWorkerThreads()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">6、开始监听,SDK func: listen()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">7、接受客Lq接QSDK func: WSAAccept()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">8、当有新的连接请求到达时Q将WSAAcceptq回的对应的客户端socket兌到IOCPQ?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">9、处理WSASend() or WSARecv()?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">在实际处理时Q可能会Ҏ需要徏立额外的U程处理socketopt命oQ甚臛_立专门处理WSAccept的线E?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">关于工作者线EWorkerThreadQ?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">通过GetQueuedCompletionStatus()Q获取I/Ocd和对应的socketQ如果ؓ接收则通知接收完成ql新的WSARecv()Q如果ؓ发送则通知发送完成?</span> </p> <p> <span style="COLOR: #c00000; FONT-FAMILY: 宋体">二、GS|络q接分析 </span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">GS上对于SS客户端采用的是WSAEventSelect模型Q通过|络事g触发相应操作?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">0、服务器ȝE启动; </span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">1、初始化WinsockQSDK func: WSAStartup ()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">2、创Z个用overlapped I/O的socketQSDK func: WSASocket()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">4、绑定端口,本地地址与创建的socket兌hQSDK func: bind()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">5、创建网l事ӞSDK func: CreateEvent()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">6、设|网l事件的响应QSDK func: WSAEventSelect()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">7、等待网l事ӞSDK func: WSAWaitForMultipleEvents()Q?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">8、分析网l事件类型ƈ处理QSDK func: WSAEnumNetworkEvents()?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">q里之所以采用CreateEvent而不是WSACreateEventQ是因ؓ由CreateEvent创徏的事件允ؓauto reset的,而WSACreateEvent创徏的事件是manually reset的?</span> </p> <p> <span style="COLOR: #c00000; FONT-FAMILY: 宋体">三、实现过E中的小插曲 </span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">在GS的客L实现中遇到几个问题?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">首先是在消息处理上,GS发到SS的消息,SSq没有完全接受到Q而SS发送到GS的消息一切正常。后来跟了一下SS消息队列Q发现SS居然可以收到GS发送到WS的消息!然后在GS上找原因Q原来是WS在和SSq消息队列Q以前GS只对应一个服务器Q无所谓共用。现在加了SSQ自然要分开处理Q否则WS和SS都可能收到发l对方的消息?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">后面一个bug从周一开始已l强怺我四天了。即使SS已经关闭QWSAEnumNetworkEventsq回的事件对应FD_CONNECT的iErrorCode值始lؓ0。因Z间涉及到多线E和多个服务器分别对应的客户端,q接到WS的没有问题,是SS的客L有问题。到今天上午为止Q我已经把GS的网l处理逻辑全部静态分析了一遍,没有M发现。͘q中午吃饭的时候,不得已只好用WS的客Lsocket去连接SSQ居然出现同样问题!而我的WS和SS都是攑֜我机器上的,q样来看Q就只有端口不同了! </span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">果然Q当我把SS的监听端口修改之后,问题解决了。因为我是?088端口监听GSq接的。当我把端口换成80Q同样问题再ơ出玎ͼ而且SS无法通过80端口监听?</span> </p> <p> <span style="COLOR: black; FONT-FAMILY: 宋体">接下来提几个问题Q?</span> </p> <p> <span style="FONT-FAMILY: 宋体"> <span style="COLOR: black">1?/span> <span style="COLOR: #c00000">被卡巴斯基监控的端口8088和服务器开启的监听端口8088有什么联p?Z么没有冲H?卡巴仅仅只是从该端口获取数据吗?Z么网l事件的FD_CONNECT的对应iErrorCode?Q表明连接成功)Q?/span> <span style="COLOR: black"> </span> </span> </p> <p> <span style="FONT-FAMILY: 宋体"> <span style="COLOR: black">2?/span> <span style="COLOR: #c00000">80是常规http端口Q它?080?088q些http端口的区别在哪儿Q这些端口绑定成功与否的原则是什么?</span> <span style="COLOR: black"> </span> </span> </p> <p> </p> <p> <span style="FONT-FAMILY: 宋体"> <span style="COLOR: black">PSQ文中关于IOCP和WSAEventSelect模型更ؓ详细的实玎ͼ可以参?/span> <a target="_blank">Network Programming for Microsoft Windows 2<sup>nd</sup></a> <span style="COLOR: black">的第五章QWinsock I/O Methods?/span> </span> </p> <p> <span style="FONT-FAMILY: 宋体">最后写完了Q发觉自己写的很垃圾Q完全就是记水帐。{念一惻IZ么呢Q自己基不扎实嘛Q第一ơ接触IOCP和网l模型,也就q样了?</span> </p> <p> <span style="FONT-FAMILY: 宋体">今天太晚了,要睡了,上面的问题明天再考虑?/span> <span style="FONT-FAMILY: Wingdings">J</span> <span style="FONT-FAMILY: 宋体">?/span> </p><img src ="http://www.shnenglu.com/Fox/aggbug/45569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2008-03-28 01:41 <a href="http://www.shnenglu.com/Fox/archive/2008/03/28/mmorpg_network_impl_analysis.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不怕无知,但怕无?/title><link>http://www.shnenglu.com/Fox/archive/2008/03/20/unwisdom_or_impavidity.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Thu, 20 Mar 2008 13:17:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2008/03/20/unwisdom_or_impavidity.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/44970.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2008/03/20/unwisdom_or_impavidity.html#Feedback</comments><slash:comments>48</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/44970.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/44970.html</trackback:ping><description><![CDATA[<p>Author: Fox</p> <p>昨天俎代庖面试了一个家伙?</p> <p>看完了他的笔试题目,感觉后背有点凉,但这些东西看看也pMQ说实话Q那些C++的题目多?span style="COLOR: #c00000">有点BT</span>?</p> <p>但我一直觉得DS的东西,如果你当初学的时候是很认真学习过q思考过的,其实是不需要去记忆的,所以我问了一个关?span style="COLOR: #c00000">E_排序和不E_排序</span>的问题。我惻I只要你理解了各种排序法的思想Q很easy?</p> <p>只是q哥们儿忘记了什么是E_排序Q我q以Z把快速排序、堆排序当作E_排序只是没记住。看来,老师从小教育?<span style="COLOR: #c00000">一道题目你即不会也要量ȝ</span>"q种思想遗毒颇深。如果抱着q种思想做程序员Q公司多半要垮掉?</p> <p>想一想稳定排序的概念吧:两个同值元素(不知Z么,我一直记?a target="_blank">严老师书上</a>用的?9Q看来我q是?span style="COLOR: #c00000">L?/span>?span style="COLOR: #c00000">死读?/span>Q最后可能会<span style="COLOR: #c00000">M?/span><span style="FONT-FAMILY: Wingdings">L</span>Q在排序前后相对位置保持不变Q即本来在前面的q在前面Q所?<span style="COLOR: #c00000">归,土归?/span>"Q看来最q思想有点消极Q难怪没有激?span style="FONT-FAMILY: Wingdings">L</span>Q。再x各种排序的思想Q我们很Ҏ得到q样的结论:最普通的O(n<sup>2</sup>)的算法,一个一个从前比到后Q自然不会媄响到同值元素的相对位置Q而O(nlogn)的算法,׃多\比较Q可能导致本来相对位于后面的元素先比较和UdQ造成不稳定。这样一惻I自然知道单的插入、选择、归q排序都是稳定的Q而改q的高效率的法则不E_?</p> <p>后面另一个同事在询问他做的Demo的事情,因ؓ是DX的东西,我不懂,没插_随便看他的历?</p> <p>看到其中一,有提C曄l大一、大二的学生做过C++培训。我本没打算提他W试中的C++部分的,但既然曾lؓ人师表(因ؓ我曾l做q学生、也做过老师Q,C++基础掌握到这U程度就不对了。尤其对于一个空的C++c默认生成哪些成员函数居然写的一塌糊涂(<span style="COLOR: #c00000">友情提示Q你也不用BS他,如果你没有看qLippman的?/span><a target="_blank">Inside of the C++ Object Model</a><span style="COLOR: #c00000">》,你先不要发言<span style="FONT-FAMILY: Wingdings">J</span></span>Q?</p> <p>我一般对语言Ҏ不太敢发表观点Q因为我的C++基础不扎?span style="FONT-FAMILY: Wingdings">L</span>Q,但我对简单的法或思想有兴趣Q没有你惌中那么高Q。可是,W试中唯一的一个需要coding的题目他又没写。我只好_C++的东西你掌握怎么h也可以不看,但这个memcpy的实玎ͼ你怎么也得有点x吧?不然怎么d代码呢?刚好在面他之前,q和同事讨论qmemcpy的问题(如果你给?span style="COLOR: #c00000">one byte by one byte</span>的实C遭BS?span style="FONT-FAMILY: Wingdings">J</span>Q因Z居然没有考虑q计机pȝ本n的数据处理)?</p> <p>本来q想问他一个关?a href="/qiujian5628/archive/2008/02/29/43477.html" target="_blank">sizeof()的问?/a>Q后来觉得也没什么必要,关于<span style="COLOR: #c00000"><span style="FONT-FAMILY: Verdana">union</span><span style="FONT-FAMILY: 宋体">的对齐,要按照单位最长的成员寚w</span></span><span style="FONT-FAMILY: 宋体">q一点自己都觉得有点</span>BTq了?</p> <p>其实Q我惌的是Q很多东西,你不能认Z掌握的很好(除非你真的掌握的很好Q,所谓很好,拿C++来说Q就是把你认Z好的地方Q你可以不翻其他东西Q把它写下来Q基本跟ISO C++保持90%以上的相似度可以了。当Ӟq样说有点贱了?</p> <p>毕竟Q做游戏E序员(其他也差不多吧)需要的是: </p> <p> <span style="COLOR: #c00000">带着Ȁ情去~码Q带着虚心d习,带着挑战M,带着压力d作?</span> </p> <p>Ȁ情,能让你的思维满具创意Q代码极光逸; </p> <p>虚心Q能让你的知识不断积累,从而达到厚U薄发; </p> <p>挑战Q能让你的团队充满活力,交流zL严}Q?</p> <p>压力Q能让你的心态保持^衡,胜不妄喜Q|不惶馁?span style="TEXT-DECORATION: underline"></span></p> <p>因ؓ自己q两周心态受?span style="COLOR: #c00000">非智力因?/span>q扰Q日子过得有?span style="COLOR: #c00000">噩</span>。写下来Q主要是Z放松一下,也提醒自己?</p> <p> <span style="COLOR: #c00000">不怕无知,但怕无畏?/span> <br /> <br />-----------------------------------------------------------------<br /><br />PSQ补C2008/03/26<br /><br />q是把上午写的一个mymemcpy放上来吧。里面没有对des < src + len的重叠情况进行讨论,因ؓ大致google了一下,g很少样做Q倒不是因Z能实玎ͼ?/p> <p>void *mymemcpy( void *src, void *des, size_t len )<br />{<br /> char *tempsrc = (char *)src;<br /> char *tempdes = (char *)des;</p> <p> size_t offset = len / 4;<br /> for( size_t i=0; i<offset; ++i )<br /> {<br />  *(unsigned long *)tempdes = *(unsigned long *)tempsrc;<br />  tempdes += sizeof(unsigned long);<br />  tempsrc += sizeof(unsigned long);<br /> }<br /> <br /> offset = len - len % 4;<br /> for( size_t i=0; i<offset; ++i )<br /> {<br />  *tempdes++ = *tempsrc++;<br /> }<br /> return des;<br />}</p> <p>刚才x证一下memcpy在地址重叠的情况下Q是否会考虑从后往前copy的情c结果看?a target="_blank">云风的blog上很早的一文?/a>Q也是讲memcpy的,角度不同?/p> <p>我想澄清一点,我写q篇blog的初衷只是ȝ几个技术问题,因此没有把面试的前因后果讲一下,反倒让很多朋友误解Q以为我怎么怎么样了?/p> <p>事实情况是,q几个问题都是本来的W试题目当中的,面试的TX从上?0:00前后做到11:30q,{我和另一个同?3点过ȝ时候,我一直没怎么说话。只是在一边看他的历和题目Q文中已l说了,是看C的简历之后才提的问题。当时是?0道左右的C++题目Q他做对的其实只有一道?/p> <p>而且Q我在提问题的时候也都将问题跟他一起分析了的(除了memcpy之外Q,自我感觉说话q是很得体的Q写文章的风格是另一码事ѝ?/p> <p>我没有丝毫瞧不vq位TX的意思,也完全没有显摆的x?/p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"> <span lang="EN-US"> <font face="Calibri">PS</font> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">Q忽然想到自己最qؓ什?span style="COLOR: #c00000">癖性十?/span>Q因为最q在x<span style="COLOR: #c00000">一个家伙的</span></span> <span lang="EN-US" style="COLOR: #c00000"> <font face="Calibri">Blog</font> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">Q如果不侉|Q我想用用他?/span> <span lang="EN-US"> <font face="Calibri">Blog</font> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">的名字?/span> <a >不许联想</a> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">》,作者是<span style="COLOR: #c00000">带三个表</span>?span style="COLOR: #c00000">王小?/span>Q《三联生zd刊》记者)。所以,如果有hx我,先看看他的东西,<span style="COLOR: #c00000">学习一下措?/span></span> <span lang="EN-US" style="COLOR: #c00000; FONT-FAMILY: Wingdings; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-char-type: symbol; mso-symbol-font-family: Wingdings"> <span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">J</span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">。一个同事,说天涯也行,我个得天涯有点相互吹捧的味道?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">恶心Q但没有恶意</span> <span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-char-type: symbol; mso-symbol-font-family: Wingdings"> <span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings">J</span> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">?/span> </p><img src ="http://www.shnenglu.com/Fox/aggbug/44970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2008-03-20 21:17 <a href="http://www.shnenglu.com/Fox/archive/2008/03/20/unwisdom_or_impavidity.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MMORPG|络模型剖析——IOCP?/title><link>http://www.shnenglu.com/Fox/archive/2008/03/06/mmorpg_net_iocp.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Wed, 05 Mar 2008 17:18:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2008/03/06/mmorpg_net_iocp.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/43783.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2008/03/06/mmorpg_net_iocp.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/43783.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/43783.html</trackback:ping><description><![CDATA[<p> <span style="FONT-FAMILY: Verdana">Author: Fox </span> </p> <p> <span style="COLOR: green; FONT-FAMILY: Verdana">//-----------------------------------------------------------------------------------------------------<br /></span> <span style="COLOR: darkgreen">夜深了,随便写写…?span style="FONT-FAMILY: Verdana"><br /></span></span> <span style="COLOR: green; FONT-FAMILY: Verdana">//-----------------------------------------------------------------------------------------------------</span> </p> <p>大凡学过~程语言和网l的TX应该都写q自q聊天E序Q那时候大安知道了套接字怎么<span style="FONT-SIZE: 10pt"><span style="FONT-FAMILY: Arial">select</span><span style="FONT-FAMILY: 宋体">?/span><span style="FONT-FAMILY: Arial">connect</span><span style="FONT-FAMILY: 宋体">?/span><span style="FONT-FAMILY: Arial">bind</span><span style="FONT-FAMILY: 宋体">?/span><span style="FONT-FAMILY: Arial">listen</span><span style="FONT-FAMILY: 宋体">?/span><span style="FONT-FAMILY: Arial">accept</span><span style="FONT-FAMILY: 宋体">?/span><span style="FONT-FAMILY: Arial">send</span><span style="FONT-FAMILY: 宋体">?/span><span style="FONT-FAMILY: Arial">recv</span><span style="FONT-FAMILY: 宋体">Q也知道?/span><span style="FONT-FAMILY: Arial">TCP</span><span style="FONT-FAMILY: 宋体">?/span><span style="FONT-FAMILY: Arial">UDP</span></span><span style="FONT-FAMILY: 宋体"><span style="FONT-SIZE: 10pt">的区?/span>……稍微用功的</span>TX或许q写q多天程序,知道了什么是dI/OQ真正致力于向QQ、MSN{即时聊天工具靠齐的大牛Ҏ文提到的IOCP更是了然于胸。更多的TX或者有兴趣l箋看下厅R?</p> <p>一、阻塞I/OQ主要指TCPQ?</p> <p>1、当socket的recv buff为空Ӟq程会wait直到新数据到达; </p> <p>2、当socket的send buff已满Ӟq程会wait直到I间_Q?</p> <p>3、当socket的accept没有新连接到达,q程会wait直到新连接到达; </p> <p>4、当socket的connect没有收到ACKQ进E会wait直到收到ACK?</p> <p>而非dI/O则是致力于提供高效的异步I/O?</p> <p>二、IOCPQ?span style="FONT-SIZE: 10pt"><span style="FONT-FAMILY: Arial">I/O Completion Port</span><span style="FONT-FAMILY: 宋体">Q?/span><span style="FONT-FAMILY: Arial">I/O</span></span><span style="FONT-FAMILY: 宋体"><span style="FONT-SIZE: 10pt">完成端口</span>Q?/span></p> <p>IOCP是MS提供的Windows内核对象Q内部用线E池理QƈҎCPU的个数确定线E个数。当数据到达后,l一投递到唯一的IOCP队列Q对应的若干工作U程用于处理q些数据Q从而实现非d异步I/O?</p> <p>单了解了IOCP的功能和原理Q下面提供几点线索,供有兴趣的TX整理思A<span style="FONT-FAMILY: Wingdings">J</span>?</p> <p>1、OVERLAPPEDl构Q?</p> <p>2、CreateIoCompletioPortQ用于创建IOCPQ关联连接来的socket句柄Q用于接收数据; </p> <p>3、GetQueuedCompletionStatusQ供工作U程调用Q取到数据的U程会加入I/O完成队列QIOCP的线E池理q些工作U程?</p> <p>三、深入学习和使用 </p> <p>1、Jeffrey Richter?a target="_blank">《Advanced Windows?/a>Q第15章,谁看谁知?span style="FONT-FAMILY: Wingdings">J</span>Q?</p> <p>2、Jim Beveridge & Robert Wiener?a target="_blank">《Multithreading Applications in Win32?/a>Q第6章,谁看谁知?span style="FONT-FAMILY: Wingdings">J</span>Q?</p> <p>3?a target="_blank">Google</a>?</p> <p> <span style="COLOR: green; FONT-FAMILY: Verdana">//-----------------------------------------------------------------------------------------------------<br /></span> <span style="COLOR: darkgreen">感觉用Office 2007~辑和发布Blog比Live Writer要方便很多,主要是Live Writer的编辑功能太了Q如?007能够寚w接进行target讄Q?br />再支持EntryNameperfact?span style="FONT-FAMILY: Wingdings">J</span>?br /><span style="FONT-FAMILY: 宋体">从新公司回来Q还没有完全适应q边宽松的环境,q几天好似梦怸般,先是</span><span style="FONT-FAMILY: Verdana">IE</span><span style="FONT-FAMILY: 宋体">出问题,</span><span style="FONT-FAMILY: Verdana">Ghost</span><span style="FONT-FAMILY: 宋体">了一道,后面?/span><span style="FONT-FAMILY: Verdana">Outlook</span><span style="FONT-FAMILY: 宋体">攉件出问题?/span><span style="FONT-FAMILY: Verdana"><br /></span><span style="FONT-FAMILY: 宋体">q是夜深人静的时候,一个h燃着烟、听着歌、喝着茶、敲着键盘有感觉…?/span><span style="FONT-FAMILY: Verdana"><br /></span></span> <span style="COLOR: green; FONT-FAMILY: Verdana">//-----------------------------------------------------------------------------------------------------</span> </p><img src ="http://www.shnenglu.com/Fox/aggbug/43783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2008-03-06 01:18 <a href="http://www.shnenglu.com/Fox/archive/2008/03/06/mmorpg_net_iocp.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>|络游戏安全思考——IPSec?/title><link>http://www.shnenglu.com/Fox/archive/2008/02/28/game_security_ipsec.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Thu, 28 Feb 2008 12:54:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2008/02/28/game_security_ipsec.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/43411.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2008/02/28/game_security_ipsec.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/43411.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/43411.html</trackback:ping><description><![CDATA[<p>Author: Fox </p> <p> <span style="COLOR: green">//-----------------------------------------------------------------------------------------------------<br />关于反外挂,q两天在和几位同事和|友讨论的结果依然是Q更多的要从{划角度解决…?br />//----------------------------------------------------------------------------------------------------- </span> </p> <p>最q在考虑安全问题的时候,在《游戏编E精_?》中看到Pete Isensee的《安全套接字》(即通常所说的Secure Socket Layer, SSL技术)Q又Google了一些IPSec的相兌料。尽IPSec是部|在IP层的协议Q但它还是可以ؓ我们提供一些思\?</p> <p>一、IPSec的认证安全(AH+ESPQ?</p> <p>1、不可否认性:采用公钥加密的数字签名具有抗抵赖性?</p> <p>2、防止报文重放:使用序列号和滑动H口以保证数据包的唯一性,即数据包被截获重发Q也会因序列L相同或者错误而被抛弃?</p> <p>3、完整性:IPSec使用单独的鉴别头部(Authentication Header, AHQ信息进行校验,防止报文改Q校验的法主要是MD5、SHA-1{单向哈希算法?</p> <p>4、可靠性:通过加密装安全有效载荷QEncapsulating Security Payload, ESPQ,IPSec对传输数据进行保护,加密法除了MD5、SHA-1Q还有加密块链接QCipher Block Chaining, CBCQ模式加密算法等?</p> <p>二、IPSec的数据加?</p> <p>在数据加密上QIPSec使用的主要是DESQData Encryption StandardQ和3DESQTriple Data Encryption StandardQ算法?</p> <p>三、IPSec的密钥管?</p> <p>Z保证数据传输安全QIPSec使用由IKEQInternet Key ExchangeQ提供的动态密钥更新机ӞDiffie-Hellman法提供密钥生成{略Q通信两端需要维持一个安全关联(Security AssociationQ,Z端通信指定认证及加密所用算法和密钥Qƈ提供序列号和滑动H口{?</p> <p>需要注意的是,IPSecq没有提供数据生到发送之前的保护机制。D例来_是IPSec可以在最大程度上保证你输入的帐号密码在传输过E中的安全,但ƈ不能防止钓鱼软g和其他木马在你输入这些信息时被截?span style="FONT-FAMILY: Wingdings">L</span>Q那应该是你要注意的?</p> <p>对IPSec有兴的TX可以?a >http://www.ietf.org</a>上下载相关的RFC文档研究研究<span style="FONT-SIZE: 9pt; FONT-FAMILY: Wingdings">J</span>?</p> <p> <span style="COLOR: green">//-----------------------------------------------------------------------------------------------------<br />本以为手上工作完成,可以h间看看安全方面的东西Q不曾想Joe又分下了CQ?span style="FONT-FAMILY: Wingdings">L</span>…?br />//-----------------------------------------------------------------------------------------------------</span> </p><img src ="http://www.shnenglu.com/Fox/aggbug/43411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2008-02-28 20:54 <a href="http://www.shnenglu.com/Fox/archive/2008/02/28/game_security_ipsec.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>|络游戏安全思考——反外挂?/title><link>http://www.shnenglu.com/Fox/archive/2008/02/26/game_security_anti_cheat.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Tue, 26 Feb 2008 08:04:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2008/02/26/game_security_anti_cheat.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/43266.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2008/02/26/game_security_anti_cheat.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/43266.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/43266.html</trackback:ping><description><![CDATA[<p>Author: Fox </p> <p> <span style="COLOR: green">//-----------------------------------------------------------------------------------------------------<br />此篇仅是对反脱机外挂的一Ҏ考,其他安全问题如登录验证、消息验证等更多的是涉及逻辑功能?br />//----------------------------------------------------------------------------------------------------- </span> </p> <p>春节刚回来的时候,回公司去和Soft聊到了自q毕业论文的问题,因ؓ专业的关p,我必ȝZ些安全方面的考虑Q正是因一点,我当时开题时q_安全的无~游戏世界进行思考。只是在游戏本n的安全性上Q一直也没有一个好的出发点Q这两周q是在考虑q个问题?</p> <p>q一点,有我入行旉不长Q对于游戏本w、玩家与开发者(含游戏及外挂、木马开发者)之间的关pdƈ没有一个很好的把握Q更多的是由于我Ҏ戏中的可用的安全技术不了解Q尤其是对应用层安全协议不了解,对破解技术也不了解,D无所适从?</p> <p>《游戏编E精_?》中Andrew Kirmse在《在U游戏的|络协议》一文中对常见的改报文、报文重攑֒逆向工程有讲q。预防报文篡改的有效防M是哈希校验,现在大多游戏是用MD5法Q而且|上开源的MD5代码也很多。对于报文重放,Andrew提到了用线性叠加随机数的状态机Q具体原理和实现方式因ؓ没有提到太详l,q要针对实际应用l箋学习<span style="FONT-FAMILY: Wingdings">L</span>。然而,׃客户端既是报文的接收者也是发送者,因此Q客L包括了完整的加解密算法。一旦客L被逆向Q上q措施就变成了破解者背后的烟雾弹,完全失去意义?</p> <p>提到反外挂,Joe的看法也是说q个东西和具体某一个技术关pM大,q是要从机制上去看。加不加密对于普通玩家没有意义,对于专业从事逆向的h更是也没有意义,所有单U考虑加密是没有效果的。对于免Ҏ戏,外挂往往是打钱公司的工具Q你他的号Q他再徏是了,代h几乎?Q而一般付Ҏ戏(像魔兽世界)一个帐号对应一个CDKeyQ一个CDKeyp几十块钱Q这个封h有点咬牙了?</p> <p>说到q里Q不妨换个思\Qؓ免费游戏加入CDKey。我一ƾ游戏从内测、封到公测Q让玩家充分参与体验Q在被逆向且外挂横行之前,按正帔R辑q营。进而假定我q一ƾ游戏在公测之后Q让玩家感觉力十。引导玩家ƈ实施CDKeyQ一个CDKey大约会需要玩家付Z许Money以示诚意Q在玩家游戏q程中,会阶D|向玩家赠送部分增值道兗老玩家在q入新区Ӟ需要申Ll用原CDKey。这样一来,外挂׃会肆无忌惮了?</p> <p>BTWQ这个思\没有从技术角度解决问题,下面再来看一U略微关乎技术实现的解决ҎQ动态验证。在游戏q行期间Q会<span style="COLOR: red">不定期的向玩家发送验证码</span>Q客L在收到消息后Q必?span style="COLOR: red">在一定时间内响应</span>Q向服务器确认收到的验证码,否则被<span style="COLOR: red">强制下线</span>Q再ơ登录后?span style="COLOR: red">更加频繁的收到验证码</span>Q直到用其良好的回复ơ数累积<span style="COLOR: red">消除其不良记?/span>为止。ؓ了尽量减因此给玩家造成的不友好体验Q在d场景、重要PK场景或者高{玩家zd场景Q验证码的发送和认?span style="COLOR: red">适当攑֮</span>?</p> <p>当然Q如果外挂中加入了图形识别,q一招也未必奏效?</p> <p>不知是道高还是魔高,可以肯定的一ҎQ大安是在利益的驱动下l尽脑汁?</p> <p> <span style="COLOR: green">//-----------------------------------------------------------------------------------------------------<br />春节回来之后Q一直比较忙Q确切的说是比较懒)Q没有更斎ͼ宜更加勤奋?br />最q工作涉及到数据库编E,一点点Ҏ据库的读写居然耗掉?天时_汗!<br />//-----------------------------------------------------------------------------------------------------</span> </p><img src ="http://www.shnenglu.com/Fox/aggbug/43266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2008-02-26 16:04 <a href="http://www.shnenglu.com/Fox/archive/2008/02/26/game_security_anti_cheat.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>异步回调的一U封装——箋http://www.shnenglu.com/Fox/archive/2008/01/25/asny_callback_ex.htmlFoxFoxFri, 25 Jan 2008 03:27:00 GMThttp://www.shnenglu.com/Fox/archive/2008/01/25/asny_callback_ex.htmlhttp://www.shnenglu.com/Fox/comments/41873.htmlhttp://www.shnenglu.com/Fox/archive/2008/01/25/asny_callback_ex.html#Feedback0http://www.shnenglu.com/Fox/comments/commentRss/41873.htmlhttp://www.shnenglu.com/Fox/services/trackbacks/41873.htmlAuthor: Fox

l于赶在周末之前调通了Q现在来ȝ一下我q个目中对于异步回调的应用背景?/p>

q个目的内容就是在游戏中用第三方库ؓ所有玩家提供更好的服务Q当server启动后,加蝲dllQ初始化该模块,当server退出时Q结束模块功能,卸蝲dll?/p>

当玩家提求后Qserver在main thread中通过lib转发玩家hQlib处理完毕Q在其独立thread中回调server为其实现的callback function。此Ӟserver需要将q回的result转到main thread中对result及其相关的玩家数据进行处理?/p>

W三方库的需求是很明的Q在合适的地方发送请求,在合适的地方处理响应?/p>

JoeҎ的要求也是很明确的,响应处理旉用server当前架构(q个架构?a href="/Fox/archive/2008/01/23/asny_callback.html" target="_blank">上一文?/a>有提?Q我的~码不涉及Q何游戏功能逻辑处理Qƈ使整个处理流E细节对后箋应用开发透明?/p>

二者结合v来,׃ؓq个目融入整个server的架构提供了完美的需求,也ؓ我的~码提供了最限度的选择I间:(Q好处是后箋功能开发可以完全无视我的编码,只需实现对回调响应后的功能,只有server底层知悉如何调用?/p>

l出序列图:

 

uml_asny_callback

Z保持对上层开发透明QOnCallback需要封装?/p>

//-------------------------------------------------------------------------------
// 一q来Q我主要参与了两ƾ游戏,切的说是半q_前面半年q没有真正涉及运营品的开发,只是做工兗?br />// 现在q个模块是我做的最快,也是压力最大的一个。现在想来,原因在于此模块涉及到游戏主逻辑底层?br />// W三方动态链接库的通信及处理?br />// 在短短几天的旉内让你的设计满W三方库的应用需求ƈW合游戏自n底层逻辑的设计风|的确有些痛苦Q?br />// 好在有Joe的指点,让我在完成工作的同时又学C一些方?)?br />//-------------------------------------------------------------------------------



Fox 2008-01-25 11:27 发表评论
]]>
异步回调的一U封?/title><link>http://www.shnenglu.com/Fox/archive/2008/01/23/asny_callback.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Wed, 23 Jan 2008 03:04:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2008/01/23/asny_callback.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/41699.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2008/01/23/asny_callback.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/41699.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/41699.html</trackback:ping><description><![CDATA[<p>Author: Fox</p> <p>前段旉写过一?a href="/Fox/archive/2008/01/10/multithread_security.html/" target="_blank">关于U程安全</a>的文字,有TX觉得不深入。因为本来就没想写的太具体,只是随便说说Q今天就惌点具体的技术?/p> <p> <font color="#006400">//-------------------------------------------------------------------------------<br />// 动态链接库 (Dynamic Link Library)</font> </p> <p>1) 动态链接;</p> <p>2) 跨语aQ?/p> <p>3) Win32q_可用Q?/p> <p> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080"> 1</span> <span style="COLOR: #008000">//</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #008000"> 静态链接库.h文g中对函数的声明:<br /></span> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> dllExam.h</span></font> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080"> 3</span> <span style="COLOR: #008000"></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">__stdcall</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"> Func( </span><span style="COLOR: #0000ff">int</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000"> nParam );<br /></span> <span style="COLOR: #008080"> 4</span>  </font> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #008000"> 动态链接库.h文g中对函数的声明:<br /></span> <span style="COLOR: #008080"> 6</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> dllExam.h</span></font> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080"> 7</span> <span style="COLOR: #008000"></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> __declspec( dllexport ) </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">__stdcall</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"> Func( </span><span style="COLOR: #0000ff">int</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000"> nParam );<br /></span> <span style="COLOR: #008080"> 8</span>  </font> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 动态链接库的静态调用:</span></font> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080">10</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">#pragma comment(lib,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">dllExam.lib</span><span style="COLOR: #000000">"</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000">) <br /></span> <span style="COLOR: #008080">11</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> __declspec(dllimport) </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">__stdcall</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"> Func( </span><span style="COLOR: #0000ff">int</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000"> nParam );<br /></span> <span style="COLOR: #008080">12</span>  </font> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080">13</span> <span style="COLOR: #000000">dllFun(</span><span style="COLOR: #000000">0</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080">14</span>  </font> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080">15</span> <span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #008000"> 动态链接库的动态调用:<br /></span> <span style="COLOR: #008080">16</span> <span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> useDllExam.cpp</span></font> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080">17</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">typedef </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">(</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">__stdcall</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">CallFun )( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> );    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 宏定义,方便使用</span></font> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080">18</span> <span style="COLOR: #008000"></span></font> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080">19</span> <span style="COLOR: #000000">HINSTANCE hDll;                        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> DLL句柄</span></font> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080">20</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">CallFun dllFun;                        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 库函数指?/span></font> </font> <span style="COLOR: #008000"> <br /> </span> <font face="Courier New"> <font size="2"> <span style="COLOR: #008080">21</span> <span style="COLOR: #008000"></span><span style="COLOR: #000000">hDll </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> LoadLibrary( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">dllExam.dll</span><span style="COLOR: #000000">"</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000"> );<br /></span> <span style="COLOR: #008080">22</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">if</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000">( hDll )<br /></span> <span style="COLOR: #008080">23</span>  </font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080">24</span> <span style="COLOR: #000000">    dllFun </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (CallFun)GetProcAddress(hDll, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Func</span><span style="COLOR: #000000">"</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080">25</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000"> ( dllFun )<br /></span> <span style="COLOR: #008080">26</span>  </font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000">    {<br /></span> <span style="COLOR: #008080">27</span> <span style="COLOR: #000000">        dllFun(</span><span style="COLOR: #000000">0</span></font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080">28</span>  </font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000">    }<br /></span> <span style="COLOR: #008080">29</span>  </font> </font> <font face="Courier New"> <font size="2"> <span style="COLOR: #000000">    FreeLibrary(hDll);<br /></span> <span style="COLOR: #008080">30</span> <span style="COLOR: #000000">}</span></font> </font> </div> <p> <br />动态链接库的一般应用都在这儿了Q更加具体的p去问google?)?/p> <p> <font color="#006400">//-------------------------------------------------------------------------------<br />// 异步回调 ( Asynchronism Callback )</font> </p> <p>今天惌的主要内Ҏ异步回调。大致结构是Q?/p> <p> <font color="#006400">//-------------------------------------------------------------------------------<br />//                           IAsyncCaller  IAsyncCallback<br />//                                         \    /<br />// CManager --> CSession --> CEvent<br />//-------------------------------------------------------------------------------<br />// class :  CManager<br />// function : Singleton实现Q管理所有CSession对象</font> </p> <p> <font color="#006400">// class :  CSession<br />// function : 处理会话Q关联事?/font> </p> <p> <font color="#006400">// class :  CEvent<br />// function : Session的关联对象,处理异步回调<br />// base class: IAsyncCaller, IAsyncCallback</font> </p> <p>在发起session的时候,new一个CSession对象Qؓ其分配一个GUIDQƈ加入理session的CManager对象的map(支持多线E操?Qnew一个CEvent对象Q将该CEvent对象讄为回调响应的hostQ该CEvent对象可进行其他同步处理?/p> <p>当回调条件满I由CManager通过相应CSession对象触发Qƈ交由其关联的CEvent对象处理?/p> <p>如果CEvent应用规模较小Q可由CManager的map直接理Q省掉CSession的中间处理?/p> <p>q种处理方式的优ҎQ将普通事务的回调处理机制抽象为通过Session Manager(CManager)q行l一理Q普通事务的处理攑ֈmain thread中,U程间通信则交lCManager和CSessionQ实C良好装?/p> <p> <font color="#006400">//-------------------------------------------------------------------------------<br />// 具体实现q里׃l出了,用到的TXҎ上面的描q应该大概知道怎么做了。其他TX如果不清楚的话,<br />// 清楚的话Q可以先google其中的一些关键词。动态链接库的部分因为内容很,因此也只提供基础使用?br />//<br />// PS: 因ؓGF学知识权的Q刚好了解到有这样一?a target="_blank">“创作共用”协?/a>Q而且最q很多h在讨?br />// <a href="/minidxer/archive/2008/01/05/40497.html/" target="_blank">cppblog的原创精问?/a>Q于是大家就看到我blog剙的这个东?)?br />// 注释风格也改成自己^时用的了:)?br />//-------------------------------------------------------------------------------</font> </p><img src ="http://www.shnenglu.com/Fox/aggbug/41699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2008-01-23 11:04 <a href="http://www.shnenglu.com/Fox/archive/2008/01/23/asny_callback.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>门窥多线E安?/title><link>http://www.shnenglu.com/Fox/archive/2008/01/10/multithread_security.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Wed, 09 Jan 2008 20:02:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2008/01/10/multithread_security.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/40845.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2008/01/10/multithread_security.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/40845.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/40845.html</trackback:ping><description><![CDATA[<p>Author: Fox</p> <p>一、多U程安全的引入:</p> <p>关于什么是多线E、ؓ什么用多U程的问题,大家可以看看Jim Beveridge & Robert Wiener?a target="_blank">《Win32多线E程序设计?/a>Q侯?译)Q或者其他随便一本提到多U程的书或文章。这里只是提到Windows环境下多U程Ҏ引发的问题和解决办法?/p> <p>1、线E在旉片结束时退出做不到</p> <p>׃Windows属于分时操作pȝQ系l会为每个线E分配响应的旉片其工作,l大多数U程不可能在旉片结束的时候完成其工作Q而下一个时间片有可能分配l其他线E?/p> <p>2、线E独立做不到</p> <p>如果U程间不存在依赖关系Q即U程A的执行不依赖于线EB的执行,此时即ɾU程B被打断,׃U程独立Q所以二者也可以相安无事?/p> <p>然而,在多U程解决Ҏ中,U程间的通信是频J而且必要的。线E通信主要有两U情况:</p> <p>1) 多个U程׃n相同资源Q?/p> <p>2) 一个线E的执行依赖于其他线E的l果或执行情c?/p> <p>q时Q我们就需要实现共享资源及U程执行的同步?/p> <p>二、多U程安全的解x案:</p> <p>因此Q多U程安全的目标就是实现共享资源的互斥讉K和线E执行的同步通信?/p> <p>通过Ҏ作系l的学习Q我们知道线E同步主要有以下ҎQ?/p> <p>1) 临界D?Critical Section)</p> <p>a) 临界资源的取舍,宜少不宜多,宜短不宜长,一个线E只能最多等待一个界段Q?/p> <p>b) 无法侦测一个界段是否已经被放弃;</p> <p>c) 临界D属于用户对象?/p> <p>2) 互斥?Mutex)</p> <p>同界段一P互斥锁也主要用于保证资源的原子访问,二者的不同之处在于Q?/p> <p>a) 互斥锁属于可具名内核对象Q?/p> <p>b) 互斥锁可以跨q程使用Q界段只能用于同一q程内;</p> <p>c) 互斥锁可以指定等待时_而且可以{待其他内核对象?/p> <p>3) 事g(Event)</p> <p>a) 事g重置h人工重置和自动重|两U方式,单说来,二者分别用于多d单写Q?/p> <p>b) 事g主要用于U程间相互通知(唤醒)Q?/p> <p>C) 事g属于可具名内核对象?/p> <p>4) 信号?Semaphore)</p> <p>a) 信号量属于可具名内核对象Q?/p> <p>b) 信号量没有拥有者,可被MU程释放Q?/p> <p>关于Win32中这四种对象的用和要点Q更详细的介l可以参照《Win32多线E程序设计》或<a target="_blank">《Windows核心~程?/a>(Jeffrey Richter){?/p> <p>三、多U程安全的实玎ͼ</p> <p>对数据Q对象、模型、消息、SocketQ的I/O处理攑֜同一个I/OU程中,保证如队列的push/pop操作、链表的insert/delete操作、文件的write操作、socket的recv/send操作、全局变量的write操作{的互斥讉K?/p> <p>新徏独立模块Q尤其是使用W三方库的独立模块,大多会创建独立的新线E。此时就需要对新线E中的数据操作加以注意,可以通过Ҏ作数据的加锁讉K解决同步问题Q当Ӟ更常见的处理方式是将新线E中的数据操作发送到专门的I/OU程中处理?/p> <p>MQ多U程安全是个常说常新的话题,现在有h提出<a target="_blank">Lock-Free</a>数据l构的解x?Maged M. Michael)Q也有所谓的<a target="_blank">Wait-Free</a>的解x?Maurice Herlihy)Q而国内网游界的大牛云风同学更是提Z<a target="_blank">单线E多q程</a>的观点和解决ҎQ因Z了解Q按字面有可能存在断章取义之嫌)。但不管怎么P从中臛_可以看出Q多U程Q说来话ѝ?/p> <p>雉散散、东拉西扯、不知所云的讲了一些东西,未必正确Q更不能当作知识。全当是?a href="/Fox/archive/2008/01/02/change_mind_2008.html" target="_blank">上次的承?/a>有个交代?/p> <p> <font color="#008000">/*****************************************************************************<br /> x多线E的问题搞明白,不是说看看操作系l教材,写点多线E读写的代码够的。且不论孰是孰非Q?br /> 单就|上诸多高手新学对加锁策略铺天盖地的争执说辞甚至怺批判指责Q可见多线E开发ƈ非只a<br /> 片语卛_挑明?br /> 为防止陷入细节争论,q里先作声明Q小文仅所学略抒拙见,无意引v争端…?br />*****************************************************************************/</font> </p><img src ="http://www.shnenglu.com/Fox/aggbug/40845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2008-01-10 04:02 <a href="http://www.shnenglu.com/Fox/archive/2008/01/10/multithread_security.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调整思\—?008ql努?/title><link>http://www.shnenglu.com/Fox/archive/2008/01/02/change_mind_2008.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Tue, 01 Jan 2008 18:43:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2008/01/02/change_mind_2008.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/40201.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2008/01/02/change_mind_2008.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/40201.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/40201.html</trackback:ping><description><![CDATA[<p>Author: Fox</p> <p>元旦攑ց3天,本来x前面写的一个存在线E安全隐患的模块推倒重来的Q可是改着改着p得不对劲了?/p> <p>既然是返工,想量把现在的理解完全加进去,让后面的人看了不要骂。可是想把几千行的代码改得面目全非ƈ且更加安全准也q不是一件容易的事,虽然对于功能和逻辑的认识比以前要清晰的多?/p> <p>拿到一个新的模块,上面一般会l个大致的deadline。除非你对这个模块和整个目的依赖关p(接口、逻辑、功能)有很好的把握Q否则,你根本不知道到底有多东西是已经实现的,有多东西是可以复用的,有多东西是需要修改的Q有多少东西是要重写的,有多东西是要新加的Q仅仅根据需求预估的q度是不可能恰到好处的。而脱M整个目实现的模块是非常可能出问题的Q尤其是在用多U程的项目中?/p> <p>当我的这个模块完成ƈ上马之后Q我沾沾自喜的跟上面_应该是不会有问题了,上面跟我说了一句:如果不出问题是奇迹了,我当旉不以为然。在后面一两周之内真的是没有什么问题,我真惛_诉他是我创造了奇迹?/p> <p>“奇q”在2007q的最后一周破灭了。在<a href="/Fox/archive/2007/12/26/yule_xiling_snow_mount.html" target="_blank">我从西岭雪山回来</a>的那天,Z增加新功能把代码修改了一些,l果W二天更C后,服务器就老是有问题,找了一下午Q才发现在修改代码的时候居然忘记对一个pointer做NULL判定Q我心想Q这U错误居焉出来了!M了Q而且q个问题出在非主U程中。然后就和同事在考虑Q这个东西如果线E同步出现问题,你就是每ơ用前都做NULL判定也没用,所以就军_把这个模块重写了?/p> <p>在这儿我׃惛_U程安全问题多说了,以后惛_了再专门d点多U程的东西吧Q今天只是想说点琐碎的东ѝ?/p> <p>因ؓ是放假,心思未必就全部攑֜上面了,代码没改多少Q倒是玩了很长旉的游戏。后来想惻I也不全是旉问题Q几千行的代码改来改去,难保不出现更多的问题。必L它当作一个新的模块去写,先要把逻辑l构完全理出来,能多l化多l化Q最好能够精到变量的用,而且把文档做l,q样可以在写文档的q程中把问题可能想全想清楚。改代码先改文档Q这几乎是所有学qY件工Eƈ写过目的同学都能认识ƈ理解的常识,可是在实际工作中Q上有Q务催Ӟ下有闲心杂念Q很难把文档和注释写好。而做不到q一点的话,你就不敢保证你的模块不出差错?/p> <p>所以,对于一个一般的需求,如果deadline?个月的话。读需求、评C赖关pR量q度要花?周,画逻辑l构、写文档要花?周,相当于前面一半的旉没有动手写代码,然后写代码大概只?周,甚至更少Q其他时间就留给试和修Ҏ档、代码了。从软g工程的角度,q样的分配是合理的,而且是应该的Q但C实际目里面Q又做不刎ͼ看来Q不是managerQ还是coderQ都不能急,软g工程不能白学了?/p> <p>我发玎ͼ我的软g工程是白学了,以后得改攏V?/p> <p> <font color="#008000">/*****************************************************************************<br /> 不想回头d以前的代码,每次看以前写q的东西Q都有一U想把它d删除的冲动?br /> 把需求看好、文档写好、时间安排好Q这才是道理…?/font> </p> <p> <font color="#008000"> 毕竟是新q_q是大Ӟ新年快乐Q?br /> 重要的是Q新的一q_别荒废了…?br />*****************************************************************************/</font> <br /> </p><img src ="http://www.shnenglu.com/Fox/aggbug/40201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2008-01-02 02:43 <a href="http://www.shnenglu.com/Fox/archive/2008/01/02/change_mind_2008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也说说数求?1+2+3...N)和其?/title><link>http://www.shnenglu.com/Fox/archive/2007/12/21/simple_series_sum.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Fri, 21 Dec 2007 02:19:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2007/12/21/simple_series_sum.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/39190.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2007/12/21/simple_series_sum.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/39190.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/39190.html</trackback:ping><description><![CDATA[<p>Author: Fox</p> <p>对于(1+2+...+N) 的求和,最早就是看高斯的故事,而且说实话,我是没有q样的智商的Q?/p> <p>                sum(1+2+...+N) = N*(N+1)/2</p> <p>刚看了一?a href="/azhisoft/archive/2007/12/19/436.html" target="_blank">研究该数求和的文章</a>Q虽侃,但实在感觉文中纰漏太多,不禁在此多言?/p> <p>文中的第一U方法自U标准,而且q能低쀜全?/3的同学都用俺的标准应付老师和试卷”,我大为惊诧:</p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font face="Courier New"> <font size="4"> <span style="COLOR: #008080">1</span> <span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i, sum </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span></font> </font> <font face="Courier New"> <font size="4"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080">2</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> N;i </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)sum </span><span style="COLOR: #000000">+=</span></font> </font> <font face="Courier New"> <font size="4"> <span style="COLOR: #000000"> i;<br /></span> <span style="COLOR: #008080">3</span> <span style="COLOR: #000000">printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1-N的数和? %i</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,sum);</span></font> </font> </div> <p> <br />昄Qprintf的结果是N-1个数的和Q此处,我更愿意怿是文中的W误而已?/p> <p>W二U和W三U方法让得奇怪:</p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font face="Courier New"> <font size="4"> <span style="COLOR: #008080">1</span> <span style="COLOR: #0000ff">float</span></font> </font> <font face="Courier New"> <font size="4"> <span style="COLOR: #000000"> sum;<br /></span> <span style="COLOR: #008080">2</span> <span style="COLOR: #000000">sum </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (N </span><span style="COLOR: #000000">^</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> N </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span></font> </font> <font face="Courier New"> <font size="4"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080">3</span> <span style="COLOR: #000000">printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1-N的数和? %i</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,(</span><span style="COLOR: #0000ff">int</span></font> </font> <font face="Courier New"> <font size="4"> <span style="COLOR: #000000">)sum);<br /></span> <span style="COLOR: #008080">4</span> </font> </font> <span style="COLOR: #000000"> <br /> </span> <font face="Courier New"> <font size="4"> <span style="COLOR: #008080">5</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">float</span></font> </font> <font face="Courier New"> <font size="4"> <span style="COLOR: #000000"> sum;<br /></span> <span style="COLOR: #008080">6</span> <span style="COLOR: #000000">sum </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> N </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> (N </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0.5</span></font> </font> <font face="Courier New"> <font size="4"> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080">7</span> <span style="COLOR: #000000">printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1-N的数和? %i</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)sum);</span></font> </font> </div> <p> <br />前面的写法纯属恶搞,^在C/C++中是异或位操作,怿接触q位q算的h都知道这一点,而且当N为奇数时Qsum的结果将比真实值少1。后面的写法更是荒唐Q当N为奇数时Qsum的结果将比真实值相Lq(有兴的可以仔细看看Q?/p> <p>对于后面两种写法Q我惌的重点不是这些明昄错误Q因L错误只可博众君一W。但文中定义sum使用float的做法,让我百思不得其解。对于计机的运,点q算的耗时和整型运的耗时Q那不是一个数量的。对于该U数q算Q我们完全可以避免Q点运,而且Ҏ在文章一开始,已l给ZQ?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font size="4"> <font face="Courier New"> <span style="COLOR: #008080">1</span> <span style="COLOR: #0000ff">int</span></font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000"> sum;<br /></span> <span style="COLOR: #008080">2</span> <span style="COLOR: #000000">sum </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> N</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(N</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span></font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080">3</span> <span style="COLOR: #000000">printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1-N的数和? %i</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, sum);</span></font> </font> </div> <p> <br />无论N为奇数还是偶敎ͼN*(N+1)一定是偶数Q因此,上述Ҏ不存在Q点运,而且pȝ会自动将/2的操作优化ؓ右移1位?/p> <p>不知怎么Q忽然就惛_了递归Q想CFibonacci数列。讲递归的教材都会拿上面的数求和和Fibonacci数列做例子。其实,我个人感觉这是不恰当的,但想想ؓ了让学生掌握递归法Q也只能丄似的单的例子。我们也知道Q递归计算对于堆栈调用是非帔RJ而耗时的,对于求Hanoi塔这L复杂问题Q我不知道不用递归有没有更好的ҎQ但如果计算Fibonacci数列q是使用递归Q在初学递归时是可以原谅的。简单点的方法可以是q样Q?/p> <p> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <font size="4"> <font face="Courier New"> <span style="COLOR: #008080"> 1</span> <span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> fib_odd </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, fib_even </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span></font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000"> ;<br /></span> <span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (N+1)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span></font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">n; i</span><span style="COLOR: #000000">++</span></font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000"> )<br /></span> <span style="COLOR: #008080"> 4</span> </font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">  fib_odd </span><span style="COLOR: #000000">+=</span></font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000">  fib_even;<br /></span> <span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">  fib_even </span><span style="COLOR: #000000">+=</span></font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000">  fib_odd;<br /></span> <span style="COLOR: #008080"> 7</span> </font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000">}<br /></span> <span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nFib </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span></font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">( N </span><span style="COLOR: #000000">%</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</span></font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000"> )<br /></span> <span style="COLOR: #008080">10</span> <span style="COLOR: #000000">  nFib </span><span style="COLOR: #000000">=</span></font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000"> fib_odd;<br /></span> <span style="COLOR: #008080">11</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">else</span></font> </font> <span style="COLOR: #000000"> <br /> </span> <font size="4"> <font face="Courier New"> <span style="COLOR: #008080">12</span> <span style="COLOR: #000000">  nFib </span><span style="COLOR: #000000">=</span></font> </font> <font size="4"> <font face="Courier New"> <span style="COLOR: #000000"> fib_even;<br /></span> <span style="COLOR: #008080">13</span> <span style="COLOR: #000000">printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Fibonacci数列前N和? %i</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,nFib); </span></font> </font> </div> <p> <br />上面的两D代码中sum和nFib的g能太?)?/p> <p>常言道,aq必失。但自私一点讲Q把自己的错误暴露给别hQ可以让自己更好的进?)Q因此,我写下来Q提醒自׃提醒大家Q更Ƣ迎大家多批评指正?/p><img src ="http://www.shnenglu.com/Fox/aggbug/39190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2007-12-21 10:19 <a href="http://www.shnenglu.com/Fox/archive/2007/12/21/simple_series_sum.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>反外挂的一点牢?/title><link>http://www.shnenglu.com/Fox/archive/2007/12/20/anti_credit.html</link><dc:creator>Fox</dc:creator><author>Fox</author><pubDate>Wed, 19 Dec 2007 18:08:00 GMT</pubDate><guid>http://www.shnenglu.com/Fox/archive/2007/12/20/anti_credit.html</guid><wfw:comment>http://www.shnenglu.com/Fox/comments/39081.html</wfw:comment><comments>http://www.shnenglu.com/Fox/archive/2007/12/20/anti_credit.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.shnenglu.com/Fox/comments/commentRss/39081.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Fox/services/trackbacks/39081.html</trackback:ping><description><![CDATA[<p>Author: Fox</p> <p>俗话_道高一,高一丈?/p> <p>今天在一个群里,有h提到某某法Q?DESQ可以杜l外挂。我当时心里苦笑一壎ͼ哥们儿,太逗了。这q头Q中国h已经被忽悠怕了。我信鬼信魔Q就是不信佛…?/p> <p>不过xQ如果能在一定程度上打击外挂Q也不错Q可是讨Z半天Q愣是没有给出具体的ҎQ最后还是不了了之?/p> <p>不过Q有旉把思\整理整理Q提一个稍微好一点的Ҏ也好?/p> <p>王城里面Q一排排的外挂小号像阅兵一P嚣张成马了,完全不把我们攑֜眼里?/p> <p>话说回来Q连个脱机外挂都防不住,别hq确实没必要把你攑֜眼里?/p> <p>q边Login Server搞了两三个月的验证码Q感觉不错,因ؓ不用外挂的玩家每次都要折腾半天Q我们自׃h员输入验证码输的都烦Q结果没出半个月外挂又开始横行了Q感觉比以前q嚣张?/p> <p>我是外挂Q我得意的笑Q我得意的笑…?/p> <p>敢情是防贼没防住Q把贼扔屋里Q自p锁在外面了!</p> <p> <font color="#008000">/*****************************************************************************<br />  晚上本来惌己写个内挂,可以偷偷懒,可惜对这东西实在是从来没有过研究?br />  折腾了一晚上Q郁郁而终?br />  技不如人啊Q想来都觉得可笑…?br />*****************************************************************************/</font> <font color="#000000"> </font> </p><img src ="http://www.shnenglu.com/Fox/aggbug/39081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Fox/" target="_blank">Fox</a> 2007-12-20 02:08 <a href="http://www.shnenglu.com/Fox/archive/2007/12/20/anti_credit.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏脚本变量存取优化http://www.shnenglu.com/Fox/archive/2007/12/17/script_variable_optimize.htmlFoxFoxMon, 17 Dec 2007 11:55:00 GMThttp://www.shnenglu.com/Fox/archive/2007/12/17/script_variable_optimize.htmlhttp://www.shnenglu.com/Fox/comments/38779.htmlhttp://www.shnenglu.com/Fox/archive/2007/12/17/script_variable_optimize.html#Feedback5http://www.shnenglu.com/Fox/comments/commentRss/38779.htmlhttp://www.shnenglu.com/Fox/services/trackbacks/38779.htmlAuthor: Fox

在MMORPG中,存在大量的数据文件和脚本文gQ这些文件涉及很多变量,当玩家信息需要存取时Q上Uѝ下Uѝ保存、服务器交互Q,即伴随着大量的读写操作。随着游戏中游戏Q务的增加Q每一个玩家对应的需要数据库存取的脚本变量的数据量也随之U性增长,随着玩家数量的增加,在服务器保存玩家角色信息的时候,通信量的大小是相当可观的Q用多U程dQ可以服务器的处理能力大幅增强Q但|络和数据库承受的压力也会大q增加?/p>

当然现在有很多的脚本语言为我们设计Q务系l提供了便利Q像Lua、Python、Rubyq些动态语a的功能越来越强,而且可以肯定的是Q会有越来越多的产品采用q些优秀的语a。但我今天要谈的不是如何使用动态语aQ也不是讨论动态语aC孰劣的问题,而是对于大量的脚本变量的存取优化。说白了Q这对于使用自定义脚本语a的游戏开发h员才更有参考h倹{而且我要说的问题很小Q小到我只是讲一点点内容Q只是我今天下午的一ҎQȝ下来更多只是Z让自p住,q不是教育别人?/p>

假设在整个脚本系l中Q存?00个与玩家相关而且需要数据库存取的脚本变量,如果一个游戏世界中拥有3000个在U玩Ӟq_每个玩家的脚本变量大ؓ10KBQ如果服务器同时保存q?000个玩家的数据Q那可不仅仅是脚本变量,当然脚本变量所占的分量比较大就是了Q,3000×10KBQ哦……与此同Ӟ服务器还要进行其实正常的|络通信和逻辑处理Q虽然不可能是同一个线E)Q但服务器承受的压力已经不小了吧Qؓ了减这U压力,脚本变量成ؓ了一U稀~源?br />Z对脚本变量的存取q行优化Q我惛_了一个最Ҏ实现的方法。通过Ҏ据库的观察(其实想也想也惛_?)Q,我发现玩家数据中大量的脚本变量的值都?或者空字符Ԍq就Z化提供了很大的一个空间?/p>

服务器一般都保存有一个脚本变量的配置文gQ在q个文g中列Z所有的脚本变量及其默认倹{当玩家dӞ服务器将为其依据q个文g为其建立一份拷贝,q从数据库读取这些变量的真实值填充之。因为大量的变量值都是默认|所以在往数据库保存的时候,是没有必要全部保存的Q而只需保存那些不同于默认值的变量名和变量g及该变量对应的下标即可。下一ơ从数据库读入的时候根据下标确定哪些变量值需要从数据库中d可以了?/p>

很简单的一个操作,虽然做到了这一点优化,但是对于500个变量的U性读取和其他操作Q依然不是一个好的处理方法?/p>

几点改进的方向,目前只是有个xQ?/p>

1、将玩家与其脚本变量解?/p>

q不是所有的玩家都需?00个脚本变量的Q不同等U的玩家可以参与的Q务和zd是完全不同的Q我们显然没有必要ؓ每一个玩家从生到死都保持q?00个变量。这栯虑下来Q估计一个玩家的脚本变量数可以减?00-400个,从而实C“垃䏀回收再利用。OMGQ?/p>

x是非常具有诱惑力的,但这一优化同时涉及到脚本策划和E序Q而且E有不慎Q对某一变量重复使用Q,全盘皆输Q在“稳定压倒一切”的大方针下Q这L优化需要给Z个系l的{略Q玩家等U、职业因素的影响都要考虑q去?/p>

2、对玩家脚本变量实现压羃存储

未经压羃的脚本变量,每个大概有几十BytesQ如果采用一个好的压~算法,能不能减到10Bytes呢?什么又是一个好的压~算法呢Q压~解压羃的成本和直接存取成本比v来哪个更高呢Q想惌些的也都是问题呢?/p>

/*****************************************************************************
  q只是我工作中的一个ȝQ问题很单,也很琐碎Q正如我前面所提的Q仅仅是提供一个参考?br />*****************************************************************************/



Fox 2007-12-17 19:55 发表评论
]]>
MMORPG中游戏世界的构徏http://www.shnenglu.com/Fox/archive/2007/12/16/game_world_architecture.htmlFoxFoxSat, 15 Dec 2007 21:24:00 GMThttp://www.shnenglu.com/Fox/archive/2007/12/16/game_world_architecture.htmlhttp://www.shnenglu.com/Fox/comments/38600.htmlhttp://www.shnenglu.com/Fox/archive/2007/12/16/game_world_architecture.html#Feedback6http://www.shnenglu.com/Fox/comments/commentRss/38600.htmlhttp://www.shnenglu.com/Fox/services/trackbacks/38600.htmlAuthor: Fox

一?/span>MMORPGQ?/span>Massively Multiplayer Online Role Playing GameQ的架构包含客户端和服务器两部分。客L主要涉及计算机图形学、物理学、多媒体技术等Q服务器主要涉及|络通信技术、数据库技术,而h工智能、操作系l等计算机基学科知识的应用体现在MMORPG开发过E中的方斚w面?/span>

一、游戏世界的划分

理想状态的游戏世界仅由一个完整的场景l成Q在《魔兽争?/span> III 》、?/span> CS 》这L单机游戏中,所有玩家位于该场景中,在理ZQ位于该场景中的L玩家都可以看到游戏中所有玩家ƈ与之交互Q出于公qx和游戏性(而不是技术上Q的考虑Q游戏中q不会这样做?/span>

然而,目前?/span> MMORPG 中,几乎没有M一Ƒ֏以做到整个游戏世界只包含一个场景,因ؓ在一?/span> MMORPG 中,同时在线的玩家数量成百上千,甚至是数万h同时在一个游戏世界中交互。以现在的网l技术和计算机系l,q无法ؓq么多玩家的交互提供x处理。因此, MMORPG 的游戏世界被划分为大不{、数量众多的场景Q游戏服务器对于q些场景的处理分为分区和无缝两种?/span>

在分区式服务器中Q一个场景中的玩家无法看到另一个场景中的玩Ӟ当玩家从一个场景到另外一个场景跨时Q都有一个数据{Ud加蝲的过E(其是从一个分区服务器跨越到另外一个服务器ӞQ玩安有一个等待的旉Q在q段旉内,服务器的主要工作是实现跨玩家数据的转移和加载以及后一个场景中玩家?/span> NPC {数据的传输Q客L的主要工作是实现新场景资源的加蝲和服务器通信。主要时间的长短主要取决于后一个场景中资源数据的大。分区式服务器的优点主要是各分区服务器保持相对独立,~点是游戏空间不够大Q而且Q一旦某个分区服务器中止服务Q位于该服务器上的所有玩家将失去q接?/span>

所谓无~服务器Q玩家几乎察觉不到场景之间的q种切换Q在场景间没有物理上的屏障,对于玩家而言Q众多场景构成了一个巨大的游戏世界。场景之_甚至服务器之间“没有了”明的界线。因此,无缝服务器ؓ玩家提供了更大的游戏I间和更友好的交互,实现了动态边界的无缝服务器甚臛_以在某个服务器中止服务时Q按一定策略将负蝲动态分散到其他服务器。因此,无缝服务器在技术上要比分区服务器更加复杂?/span>

目前国内上市?/span> MMORPG Q大多采用分区式服务器,做到无缝世界的主要有《完世界》和《天下贰》等Q国外的 MMORPG 中,像《魔兽世界》、?/span> EVE 》等Q都实现了无~世界?/span>

无缝服务器与分区式服务器在技术上的主要区别是Q当位于场景 S1 中的玩家 P1 处于两个Q甚x多)场景 S1 ?/span> S2 的边界区域内Ӟ要保?/span> P1 能够看到场景 S2 中徏{、玩家?/span> NPC {可感知对象。而且边界区域的大要大于{于 P1 可感知的范围Q否则就可能发生 S2 中的可感知对象突焉现在 P1 视野中的异常?/span>

无疑Q无~世界ؓ玩家提供了更人性化和更具魅力的用户体验?/span>

二、无~世界游戏服务器的整体架?/span>

MMORPG 的服务器架构从功能上主要划分ZU:

1?/span> d服务器( Login Server Q?/span>

d服务器用于玩安证登录,q根据系l记录玩家信息得到其所在节Ҏ务器Qƈ通过世界服务器ؓd玩家和对应节Ҏ务器建立q接?/span>

2?/span> 世界服务器( World Server Q?/span>

世界服务器将整个游戏世界划分成不同场景,所有场景按一定策略分配给节点服务器,q对节点服务器进行管理。世界服务器的另一功能是与d服务器交互。因此,世界服务器是d服务器、节Ҏ务器的沟通桥梁,当然Q一旦玩家登录成功,世界服务器将主要处理节点服务器间的通信。因此,世界服务器对于玩家是透明的?/span>

3?/span> 节点服务器( Node Server Q?/span>

节点服务器负责管理位于该节点的所有玩家?/span> NPC 的所有交互,在无~世界游戏中Q由于边界区域的存在Q一个节Ҏ务器甚至要处理相邻节点上位于边界区域的玩家和 NPC 的信息?/span>

在具体实CQ不同的 MMORPG Z便于理Q可能还会具?/span> AI 服务器、日志服务器、数据库~存服务器、代理服务器{?/span>

三?/span> 无缝世界游戏服务器的主要技术需?/span>

1?/span> ~程语言Q?/span> C/C++ ?/span> SQL ?/span> Lua ?/span> Python Q?/span>

2?/span> 囑Ş库( Direct 3D ?/span> OpenGL Q?/span>

3?/span> |络通信Q?/span> WinSock ?/span> BSD Socket Q或?/span> ACE Q?/span>

4?/span> 消息、事件、多U程?/span> GUI

5?/span> OS

三、无~世界游戏服务器需要解决的主要问题

1?/span> 资源理

无论是服务器q是客户端,都涉及到大量资源Q玩家数据?/span> NPC 数据、战斗公式、模型资源、通信资源{。当q些资源辑ֈ一定规模,其管理的隑ֺ不可忽视。而且Q资源管理的好坏Q直接关pd游戏的安全和生命?/span>

2?/span> |络安全

安全永远是第一位的Q我们无法指望所有的玩家及其所持的客户端永q是友好的。事实上Q威胁到游戏的公qx和安全性的大多数问题,归根l底Q都是由于网l通信中存在的ƺ骗和攻击造成的,q些问题包含但不限于交易ƺ骗、物品复制?/span>

3?/span> 逻辑安全

逻辑安全按理说应该是游戏中最基本的考虑Q覆盖的范围也最q最杂。随机数pȝ是一个非常值得重视的问题,随机C仅仅用于玩家可见的一些Q务系l、战斗公式、h工智能、物品得qQ还可用于网l报文加密等。因此,随机数系l本w的安全不容忽视。另外一个常见的逻辑安全是玩家的UdQ最主要的就是防止加速轮这L变态操作?/span>

4?/span> 负蝲均衡

MMORPG 中的负蝲均衡包括客户端及服务器资源管理和逻辑处理的负载均衡,其中最N知的是网l通信的负载均衡,正常情况下的|络通信数量是可以在游戏设计时做估的Q但因恶意攻击造成的网l负载是无法预测的。因此,负蝲均衡所要处理的主要是实时动态负载均衡和N恢复。负载均衡需要解决的问题包括负蝲监控、负载分析、负载分发和N恢复?/span>

5?/span> 录像pȝ

录像pȝ的构建,主要用于重现关键数据的输入输出,如玩家交易、玩家充|或者当 bug 出现后,为逻辑服务器(泛指上文提到的所有类型服务器Q主要是节点服务器)相应部分启动录像pȝ。待攉到够数据后Q通过录像pȝ重现 bug 。ؓ了逻辑服务器不受自w时_如中断调试等Q的影响Q还可以专门设计心蟩服务器来控制数据传输?/span>

四、ȝ

?/span> MMORPG 中,真正?/span> bug 永远存在于将来。从q一点出发,关于 MMORPG 中游戏世界的构徏Q怎样苛刻的思考都不ؓq?br />
参考资料:

1?[] Kim Pallister~? 孟宪?{译. 游戏~程_a5, P467-474, P516. 人民邮电出版C? 2007q?? 北京.
2?[] Thor Alexander~? 史晓?? 大型多h在线游戏开? P174-185. 人民邮电出版C? 2006q?2? 北京.
3?[] Dante Treglia~? 张磊 ? 游戏~程_a3, P117-122. 人民邮电出版C? 2003q?? 北京.
4?[] Mark DeLoura~? 王淑C?{译. 游戏~程_a1, P90-93. 人民邮电出版C? 2004q?0? 北京.
5?[] Douglas {著, 於春?? C++|络~程 ?. 中国电力出版C? 2004q?1? 北京.
6?[] Stephen D. Huston {著, 马维?? ACEE序员指? 中国电力出版C? 2004q?1? 北京.
7?[] Erich Gamma{著, 李英?{译. 设计模式. 机械工业出版C? 2000q?? 北京.
8?游戏引擎全剖? http://bbs.gameres.com/showthread.asp?threadid=101293.
9?服务器结构探讨:d服的负蝲均衡. http://gamedev.csdn.net/page/351491d0-05ad-48a4-85e1-77870bc1eef3.
10、服务器l构探讨Q最l的l构. http://gamedev.csdn.net/page/28695655-974c-4291-8ac4-2589c4e770d3.
11、谈谈网l游戏服务器解决Ҏ. http://www.beareyes.com.cn/2/lib/200411/08/20041108102.htm.
12、负载均衡——大型在U系l实现的关键(下篇)Q服务器集群架构的设计与选择Q? http://blog.csdn.net/sodme/archive/2005/06/15/394576.aspx.
13、云风的BLOG. http://blog.codingnow.com/

/*****************************************************************************
  ?:00?:00Q在写这随W的q程中,我翻找、点ȝ上面的这些资料,其实q有?br />  多的资料Q没有记在上面,是为开题做的准备。现在依然是睡意全无。越写越觉得
  不够Q越惌觉得q有更多东西写不出来…?br />  PSQ这些资料大都不是第一ơ翻Q以前看q些资料大多只是单纯的看Q现在有目的?br />  看,才觉得都写得很有味道。不是不是同意所有观点,都不是本文讨论的重点?br />*****************************************************************************/


Fox 2007-12-16 05:24 发表评论
]]>
ŷһþþþþþôƬ| þþþþþþ뾫Ʒպ| ɫۺϾþĻ| þۺϸþúݺ97ɫ | þþ뾫Ʒպ˳| 18ƾþþAAAƬ| ˾þü91| þֻоƷƵ99| AVþþƷ| þþƷѹۿ97| ޾þһ| 99þþƷѿ| þˬˬƬAV| þѾƷƵ| ۺ˾þôý| ھƷ99þ| AVþ| ձWVһһþ㽶| Ʒþۺ123| þüۺɫۺϰҲȥ| þõӰ| þþƷһ| ޾Ʒþþþϼ | ŷۺϾþͼƬ| þˬˬˬ˾þþ| ŷþþþƷӰԺ| һƷþ| þþƷƷ| þ99ֻƵƷ8| Ʒ׾þAAAƬ69| ѾƷþþþþĻ | ˬݾþþۺ鶹| ۺһ˾þþƷ| ޹Ʒþþþþ| þþƷƷ| һþþƷ| ŷ糱þþXXXXx| þҹɫƷAV| ޾Ʒһ߾þ| ɫۺϾþ| ޵һƷƷþ|