bookmark_border服务器端写烦了,写写日志帮助一下思考

公司没有写服务器端的经验,之前用某服务器端引擎提供商提供的示例代码改改出了一个游戏。这次轮到我当服务器端程序(一个人负责C++全部,哈哈),看原来的代码没用到的示例功能特别多,很碍眼,想重写一个清爽简洁版的服务器端,但是这需要好好理解哪些代码可以删,哪些不能动,偏偏引擎是闭源的,我只有header和示例的注释可以看,初始化时七八个管道啊连接器什么的实在猜不出是干什么用的,读所有那些header也很花时间,犹豫了。
从吸收知识的角度来说,肯定是好好理解一下比较好。但是我毕竟是拿钱工作的,消化任务列表的速度太慢,可能被公司添加新人进来——其实已经听说准备招人加入服务器端开发了——我独占服务器端开发的时间有限,在别人来以前尽量多推进一些也许比较好?比如公司看我一个人也写得挺快,就让我自己干了什么的。我这段时间刚投了简历准备跳槽,挺希望能在走之前给这个项目搭好稳固的地基(最好干脆让我干完再走更有成就感)。反正就是各种时间不够用。偏偏我上一个项目的php工作太悠闲,已经很难集中精神读大段代码了(写还是没什么问题,写比较容易投入)。坐在座位上开开微博,看看邮箱,干着急就是不去读代码。
现在也是,我看我实在是不肯干,就索性出来写写日志放松一下,也让文字帮助我思考,看看这个问题到底出在哪。
这个服务器端怎么写,我心里大致已经有数了,上周也刚写好对战部分提交了。今天开始要写游戏房间、匹配等等进入战斗前的部分。虽然代码还没细看,但我们有rpc定义文件,仔细读了一遍,知道客户端可以调用哪些功能,对这个匹配服务器怎么做也就有了大致的印象。就像笃志说的,架构一看就懂的感觉。
架构虽然懂了,落到实现还是很犹豫的,毕竟实现方法太多了。而我又好多想,希望在架构设计阶段就把之前困扰我的服务器端调试功能也搞定,这下更不敢动手了。其实服务器端调式,我的终极理想是做成跨平台,让vs也能编译运行服务器端,这样调试就不是问题了。不过我们的引擎商只给了我一个老版的windows端lib,只有linux版的.a是最新的,这链接上去谁知道跑得对不对呢。还有我们现在的服务器端主要靠引擎商的示例代码,里面直接用到了fork函数,这个我真是没法在windows下模拟,平台跨不起来。要么大改逻辑,但那样工时就会花很多,上头问下来我说我搞个人研究重构着玩儿掉了5个工作日什么的,那还得了。我现在能做的,就是一层一层的分开,让这个项目尽可能多的部分可以被windows编译运行。战斗部分因为可以独立运行,现在已经实现在windows下运行了,不过debug还是不是很顺手,看来只有vs也不能解决问题。我们公司是没有这方面的经验,真没有,连gdb的存在和用法都是我教他们的,在那以前他们完全靠log来debug服务器端。
好了,再说回来,这个服务器端调试不顺手。因为客户端和服务器端通信有一个顺序和时间间隔,我想做一个操作顺序就要改一次客户端代码,不方便。这里我的理想解决方案肯定是导入lua,毕竟以后也需要测试机器人这一点已经确认了,早晚要做这个功能。不过做测试机器人的任务有它自己的工时,现在做是占用我做匹配服务器的工时,不好。另外还有一点,是不能同时停下两边。一边下了断点停下了,另一边很容易超时。尤其gdb我玩得还不是很得心应手,比起下条件断点,我更常做的是最开始就下好断点,然后每次被断了就continue,直到我想要的那个条件的到来。说是每次,其实也就两三次啦,但客户端那边是有固定时序的。我每次打continue或者c的时候,时间误差都会累积,最后时序就不是我预期的样子了。这一点真的烦,习惯了vs上开发单机游戏时尽在掌握的调试能力,现在是各种憋屈恼火。服务器端调试已经是太钝的斧头了,需要我磨刀一下才不会耽误今后大量砍柴的任务。当然,这个耗费的工时只能自己挤出来了。问题是,我肯出这个时间,也不知道该怎么改良。如果断下来之前先通知另一端,就需要一个类似break()函数,里面是rpc通信,但这就失去了断点可以实时添加的便利。我每加一个断点,都要重新编译一遍的话,我宁可自己读代码找bug。一个想法是,两边的超时行为应该默认不发生,直到我手动发出一个超时信号,才出发当前阶段的超时。这样一边进入断点也不用着急,算是为调试专门设计的环境,可能需要定义特别的编译宏来开关这个功能什么的。为了今后的等待也能被这个调试方式管理,程序中所有的超时管理应该使用统一的方法。在服务器端,我估计会有控制时间流这方面的需求,所以已经做了一个GameTimer类,游戏中所有的时间都是询问GameTimer来获得的。那么调试模式下,每次启动GameTimer时它都不动,直到收到debug超时信号,就一口气走过一个巨大的数字,保证什么逻辑都超时。甚至debug超时信号中可以自带走过的时间,让时间的流动尽在掌握。嗯,听起来有点靠谱了,不愧是靠写字思考的男人,写博客果然有效,哈哈。
哎,我就喜欢琢磨这些基础建设,因为以后都能从中获益。游戏逻辑的具体实现是写过就算,对我来说属于用过即弃的代码,没有沉淀,没什么兴趣。