准备每三个月进行一次工作总结,并总结下除工作外做了些什么事情,以及收获有哪些。
从过年回来到现在差不多有三个月,工作方面主要是做了PVP/PVE玩法实现,机器人和匹配基础系统,掉落和其他xxx系统,以及副本相关的通用系统,然后又优化了一些底层框架,比如GetFromxxxt和Getxxx调用,因为对于lua来说,通过table+元表的方式查找一个元素,可能会进行多次,原来的实现获取一个数,比如从table中获取某个key(GameDataMap)的索引为key1(pvp)的元素,原来实现大概是:GetFromGameDataMap(pvp),这样一个调用涉及了三次函数调用和两次判断:一次本身的调用,如果没有找到,那么rawget或rawset,然后获取到GameDataMap的table,然后再rawget的key1,然后再判断,最后返回;逻辑只是想找一个数来处理,但是实现却比较复杂,如果一个场景中来个一百个玩家和几百来只怪,由于场景中是随时随地进行PK的,那么可能造成很大的计算资源浪费,后来我做的优化主要是在创建entity时先缓存这个GameDataMap table的引用地址,因为这个table在这个entity的生存到消失前,(地址)是不会变的,所以这么做:self.__cacheGameDataMap = self:GetGameDataMap(),那么这样每次获取少了三次函数调用,和两次判断,这样性能得到了比较大的提高。当然代码中还有类似的使用,都进行了一次优化。
对于有些玩法,当人数不够时,需要上机器人,怎么去选择机器人和匹配玩家,这里面还是有很大的文章可以作,毕竟和各方面相近的“玩家”一起战斗比较有意思些,不然很容易被秒。这方面其实还是要多思考,毕竟一个服同时在线最多也就几千人,所以匹配系统也挺好实现的,量不大,关键是以哪些因素去划分,这方面可以思考下。
其它的没什么难度,纯粹堆逻辑,多则一两千行代码可实现。但是在测试自己实现的功能时,也发现了一些其他同事功能的bug,有几个难以发现的且需要在特定操作下才能触发的,感觉还是要多测试。
工作之外就是学习了四个开源的项目和沉淀了几篇文章:主要是pink/floyd/libco/phxrpc这几个源码,每个代码量不多,但是实现却蛮溜的,也去复习了下汇编和c++11的一些并发知识,重点是内存模型,也看了下ucontext和四个函数的源码实现。从中更好的掌握了如何使用多线程和协程去实现一个高并发的服务,包括epoll+timer的使用,怎么管理资源,任务队列和Raft相关的实现等,可能以前知道epoll的实现原理,怎么实现网络框架,知道多线程怎么用,知道socket相关的函数,read时发生什么,以及底层原理,但是如何高效的使用却还是需要多实践(可能有些业务没有机会用到)和看代码,原理掌握了,看这些开源项目的设计也比较容易些。
接下来的两三个月,准备把tbsys/LevelDB的基础代码分析一下,后者网上资料蛮多的,tbsys是淘宝多隆写的代码,感觉还蛮有学习的价值。
也准备看下(多线程中)锁的性能优化这些,上月初看到阿里资深技术专家在微博说的如何优化读写锁,把读锁升级为写锁等,也下载了那篇论文和源码实现,然后再分析下dpdk中锁的相关实现,会一起写篇博客,分析一下吧。