libcopp v2的第一波优化完成之前测出来libcopp还有一些列优化点,但是要破坏之前的API,所以整理了一下优化的想法和方案。 预留空间和合并分配 之前有太多的堆内存分配了,导致很多碎片。那么第一个想法就是协程对象可以分配在栈上,runner也可以分配在栈上。然后还可以加一个自定义预留长度。每个对象对齐到sizeof(long),总长度对齐到64 Bytes。更多
libcopp(v2) vs goroutine性能测试本来是没想写这个对比。无奈之前和call_in_stack的作者聊了一阵,发现了一些libcopp的改进空间。然后顺便看了新的boost.context的cc部分的代码,有所启发。想给libcopp做一些优化,主要集中在减少分配次数从而减少内存碎片;在支持的编译器里有些地方用右值引用来减少不必要的拷贝;减少原子操作和减少L1cache miss几个方面。 之后改造了茫茫多流程和接口后出了v2版本,虽然没完全优化完,但是组织结构已经定型了,可以用来做压力测试。为了以后方便顺便还…更多
libatbus的几个藏得很深的bug在写这篇文章前,我突然想到以前流行了一段时间的服务器面试题:当一个BUG只有几百万分之一的概率会出现,怎么办?这个问题在这个BUG里只是毛毛雨而已,因为这次的BUG的出现概率是夸张的三亿分之一。 我在好几年前自己开发了一个用于服务器进程间通信的框架,libatbus,以前用在了客户端的模块隔离的通信心痛中。并且现在开始正式用于服务器。但是前两天看了一下服务器的日志,发现了比较奇怪的-202错误。更多
用cmake交叉编译到iOS和Android最近看了下最新版本的cmake的文档,很惊喜地发现他已经支持直接设置Android和OSX的一些变量了,然后有瞄了一眼NDK,发现里面现在也停工官方的cmake支持。 索性干脆试试用cmake做对android和iOS平台的一些库的交叉编译,这样用cmake的环境监测系统就会比原来写Makefile+脚本要简单多了。更多
开源项目得一些小维护其实我那几个特别是工具类得开源项目一致都有维护和更新,但是每次更新得量和要点并不怎么突出所以一致也没写点什么。但是偶尔吗也会碰到一些稍微值得记录的东西,但是又不多所以很多都遗漏掉了。 虽然漏掉得那些也补不回来,我还是对近期得一些维护稍微记录一下吧。虽然近期维护得内容稍微多一些,但是也只能靠记忆回忆一些了。更多
atapp的c binding和c#适配这两天在做服务器框架的C的接口导出和C#的接入。之所以要做这么个东西是因为之前的服务器框架(atsf4g-co)已经完成了通信层面和基本设计模式的细节部分,而且基本算是最大化性能了吧。但是现在的项目的战斗引擎是从以前Unity游戏上抽象而来的,全部由C#编写。再加上最近再考虑接入实时战斗,这样就不能像之前一样用一个简单的通信方式了,必须使用一个高效并且实时性更高通信机制。需要能够处理好比较高的集中式的组播和容灾的通信方式。于是就有了把之前的C++的框架抽离出API来驱动逻辑的…更多
对象路由系统设计起源 现在的手游也开始越来越复杂,以前少量交互线上保存的服务器架构越来越不能满足现在越来越偏向PC端MMORPG的需求。比如现在手游也引入了地图服务、公会服务等等。特别是地图服务需要能够动态切换服务节点、并且由于广播量巨大,导致我们得用更多级的缓存和更复杂的负载均衡。这些缓存和负载均衡都会涉及缓存失效、同步、更新、发现延迟等问题,所以越来越需要一个路由系统来解决这些问题。更多
近期的一个协程流程BUG最近一直没什么时间整理近期碰到的问题,今天思考了一下之前碰到的一个临时处理的BUG,顺便写点东西清理一下思路。 其实严格来说这个BUG更应该是一个流程试用问题,不过这个问题应该是需要能在协程库里检测并抛出错误来。更多
重写了llvm+clang+libc++和libc++abi的构建脚本由于之前整理的服务器框架已经完成了,就需要用各种静态分析工具跑一遍。原来的llvm+clang的编译脚本是从GCC那个脚本copy过来然后改的,使用的时候各种问题。所以干醋重新折腾一遍,重写了。 之前的脚本,每次升级版本都要折腾下,一开始是编译的默认静态库巨大无比,后来改成动态库后一会儿好一会儿不好。 目测3.9.0版本的问题是开启动态库的编译模式以后有些子工程还是静态库,并且会漏掉加-fPIC,即便我在cmake的选项里加了也没用。 而且有时候是用gcc编译正常,用…更多
atsf4g完整游戏工程示例近期仍然在搭建完整的游戏服务器架构。基于atsf4g(asynchronously-tree server framework fo game)的完整解决方案终于接近完成。基本框架之前其实已经做完了,但是之前解决的只是基本的框架层代码,不包含任何特定的交互模型、协议模型、配置服务等等。这回就整理了一个只包含登入登出逻辑的完整工程,另外优化了一些小细节和周边工具的支持。更多
atframework基本框架已经完成好久没写blog了。最近空闲时间都在加紧完成atframework框架。总算是搞完了,并且搭建了一个静态介绍页。以后有空慢慢加文档进去。 主页: https://atframe.work/ Github: https://github.com/atframework/ 目前这个项目已经是一个小型游戏服务器的完整框架,包括服务器间实例的管理、客户端和服务器的内部协议和通信机制。并且实现了纯C的port。 然后…更多
游戏服务器的不停服更新我们目前的游戏第一次测试的时候笔记送匆忙,导致上线之后频繁更新。 比如BOSS战由于大区的人数和预期不一样导致的难度调整,或者是任务链或者数值调整,再加上一些BUG。 但是每次停服更新的话用户体验是比较伤的,所以后来就采取了一些措施来减少更新的停服时间。最后基本实现了不停服更新。更多
对atbus的小数据包的优化atbus是我按之前的思路写得服务器消息通信中间件,目标是简化服务器通信的流程,能够自动选择最优路线,自动的断线重连和通信通道维护。能够跨平台并且高效。 近期优化底层库,完成atapp库的基本功能,顺带优化了一下atbus的一些功能,也是对高效的大幅优化。这次的优化起源于某一次的压力测试,先介绍下压力测试的结果吧。更多
Android和IOS的TLS问题这个问题起源于以前给客户端写的一个log模块,然后里面为了线程安全且多线程下不互相写乱,并且因为这些系统基本都用比较高版本的编译器,都支持C++11了,所以就用了C++11的TLS功能。 但是Android的默认std库并不是libstdc++或者libc++,而是Bionic。IOS不知道是什么版本的标准库都不支持thread_local的关键字。 这个之前写过一个记录提到过 Android NDK undefined reference to…更多
pbc的一个陈年老BUG近期跟了一下pbc的lua-binding的一个老BUG,起源是我们客户端报了一个奇怪的问题,我们游戏里的某些功能的optional字段,服务器并没有下发数据,但是客户端竟然能读到。 一开始我去issues里翻,翻到了个这个, https://github.com/cloudwu/pbc/issues/27 。 这是2014年就发现的BUG了,然而云风说考虑到性能问题不想改。大事我觉得吧,就算一些性能损失,也好过容易出BUG,并且协议打解包在游戏中的CPU占用本身就不重。所以…更多
boost.context-1.61版本的设计模型变化前言 之前写了个C++的协程框架libcopp,底层使用的是boost.context实现,然后剥离了对boost的依赖。然而这样意味着我必须时常跟进boost.context的更新。 顺带提一下这个协程库已经在我们线上服务器版本中使用了。 从最初的boost版本(我忘了从哪个版本开始了)一直到1.60版本,boost.context的变化都不大,都只是补全一些新的架构和体系结构,还有就是修复一些小细节的BUG,再就是增加了对valgrind的支持(之前写过一个Merge记录…更多
理解Raft算法前言 最近在分布式系统一致性方面,Raft算法比较火啊。所以就抽时间看了下这个算法。 之前已经有Paxos算法,用于解决分布式系统最终一致性问题,而且已经有了zookeeper这个成熟的开源实现。那么这个Raft算法有啥用呢?按照Raft官网的说法,这个算法的错误容忍和性能和Paxos算法类似,但是拥有更加简单易懂的设计。 看过Paxos算法的童鞋们都知道,这货复杂地和屎一样,为了实现去中心化而考虑了各种复杂的边界条件和时序下的可靠性。而Raft算法则根据实际应用中的需要,简…更多
libatbus基本功能及单元测试终于写完啦libatbus 经过茫茫长时间的编写+过年在家无聊补充和修正单元测试,再加上这两天的整理,终于把以前的这个关于服务器通信中间件的基本功能和相应的单元测试完成啦。还是可以热烈庆祝一下的。 《关于BUS通信系统的一些思考(一)》 《关于BUS通信系统的一些思考(二)》 《关于BUS通信系统的一些思考(三)》 主要的思路还是在自动选择共享内存或是tcp或是unix socket进行通信。使用节点ID,屏蔽底层通信细节,屏蔽自动重连细节和节点之间自动建立直连的细节。同时基于目前的游…更多
博客文章和文档迁移到gitbook使用Markdown写blog已经很久了,近期接触并且看了下流传已久的gitbook平台,感觉做得确实不错。、 之前写blog的时候一直用得是stackedit,是因为stackedit的对Markdown做了很多扩展,功能很强大,有自动目录、流程图、时序图等等,然后可以浏览器直接开很方便。但实际上这些功能写出的东西虽然不错,但是放到比如github上的时候,github不支持。目前大多数平台对Mardown的扩展都只是到了和github差不多的地步,没有到stackedit…更多
给客户端写得LRU缓存前言 由于我们的客户端的元素和资源比较多,cocos框架的各种库质量参差不齐,导致了有些地方加载速度实在很慢。并且没有一个统一的内存管理机制导致了整个内存占用不太好控制。 同时手机的硬件环境实在是千差万别,在IOS上,由于CPU和IO比较好,很多东西重算代价倒不大。 但是在Android上,CPU本来就偏弱,然后很多国产性价比机器,零件都缩水在IO设备上,还附加了各种用于节能和降低发热的降频策略,锁CPU策略。导致了很多数据重建的延迟比较高。 然而我们很容易发现,大多数…更多