2015-12-01 刘太华
再次看redis的分布式锁 话说以前我们也有用到这种需求, 在一个noSql数据库中,利用key的expire功能实现的一个锁,那时候因为memcache支持不是太好, 还是略有些问题,不能在很严苛的环境中使用。 主要是一个解锁时候的问题: 当clientA获得锁之后,进行后续逻辑block在某个地方,如果这个时间足够长,长过锁的有效时间(即set在memcache中的expires时间), 当clientA完成操作,解锁的时候,如果直接使用del操作, 很有可能就会把clientB刚刚完成的锁操作(set key)给删除掉。 解决的方法是在unlock前检查一下clientA自己之前的锁是否还有效, 然后再决定是否执行del 继续阅读 »
2015-11-29 刘太华
一次rabbitmq没用好的资源泄露 最近重写的一个使用rabbitmq做borker的服务, 一个go-lang的小服务,支持多节点,很简单就是从mq获得msg, 如果有通过websocket连接上来的client, 那么就push给它。 继续阅读 »
2015-11-22 刘太华
job
换了新工作了, 也算换个视角做技术了. 还好的是之前虽然是做游戏, 不过是页游, 非传统端游, 用的很多东西还是和普通互联网行业很类似的, 这才没导致脱了游戏就找不到工作的境地, 话说有不少的公司并不待见从游戏行业转行的,略悲剧。 继续阅读 »
2015-09-12 刘太华
游戏的场景服务和数据服务整合 一直以来都觉的现在运行的游戏后台服务, 实在太多了。 1,数据服务和场景服务之间的通信, 用的是消息队列zeroMQ来做的, 无形就多了一个消息队列服务, 然后还有一个处理队列任务的mq_worker, 然后数据服务到场景服务的通信. 2, 需要在每次需要的时候都建立一次本地的socket,就2个服务之间,产生了多余的好多事情。 继续阅读 »
2015-08-28 刘太华
向量的归一化 从起始点A到目标点B的路径上的碰撞检测 常见的一个应用场景:游戏技能里有玩家冲一个地方闪现到另外一个指定点,中间不能有阻挡物, 否则就停在阻挡物那里。 在几何空间中, A每次移动一个单位长度dir,逐步靠近B,就是A每次增加一个unit vector 归一化:即将一个向量, 使它的模(length)等于1,并且方向不变, normalize后的向量dir, 就是一个单位向量了 用做在空间中,向量往前增加一个单位长度, 即 += dir 继续阅读 »
2015-08-22 刘太华
工厂类回收资源和夸线程回调时对象是否还存在判断 虽然大多数逻辑都在单线程里实现, 但是不能避免的是一些IO阻塞类型逻辑, 不得不放入子线程里执行,当IO完成后boost:bind(callback, arg1, arg2 ...) 放入主线程队列内执行callback, 但是问题是,假如callback指向的对象函数的对象, 已经销毁了, 这时候就无法判断对象是否还存在了,不判断就会core dump. 继续阅读 »
2015-07-26 刘太华
玩家数据的loader优化 由于历史原因, 最早的时候玩家数据是在2个独立的服务进程中都存在, 游戏场景服务A, 和游戏数据逻辑服务B, A中的数据来自于B, A服务会根据某些逻辑, 触发数据回存, 将数据回存到B, 达到数据一致性要求, 但是随着游戏过程中, 会积累资源比如金币之类的, 这个积累的数据暂时只会存在场景服务A中,后面的运营过程中证明, 这种数据分两份的做法, 是个非常大的坑, 有很多理论上的机会导致数据不一致, 丢数据的问题。 继续阅读 »
2015-07-18 刘太华
游戏碰撞场景(一) CoWorld构建过程 脑图 继续阅读 »
2015-07-10 刘太华
一个自定的dynamic_cast设计 一个运行时检查的自设计dynamic_cast转换系统: - 包含2个预编译宏,CnDeclareRootRTTI 和CnDeclareRTTI, 宏的目的只是为了生成对应的代码, 实际手法和直接在类里码代码是一样意思; - 一个简单的RTTI类型,每个基类和派生类将会自带一个RTTI的实例属性: ms_RTTI, RTTI类如下: class CnRTTI { public: CnRTTI (const char* pcName, const CnRTTI* pkBaseRTTI); inline const char* GetName() const {return m 继续阅读 »
2015-07-06 刘太华
网关编码一 拆了又补, 补了又拆,边拆边想,发现之前用asio socket的方式做gateway, 有不少问题。 1. 如果用asio做连接upstream server的socket, 还需要把byte buffer实现一遍, 虽然已有现成的buffer代码, 不过生搬过去还是显的略繁琐; 2. 如果用asio, 下游用的是epoll, 要在asio的async_read_some, 和epoll的 OnRead, OnWrite间穿梭, 感觉好脑残,之前的想法果然傻逼, 当然推翻它重来了; 3. 改成都用epoll监听, 方便很多。基本上就是设计一个新类 ProxySClientSocket 继承SClie 继续阅读 »