2015-07-03 刘太华
AITrace的基本路数 先记录几个经常用到和碰到的三角函数和向量点计算时用到的tips: 有二维向量 A(x, y), B(x, y) 1, 向量的模, 可以看做是向量点在x,y坐标系下的向量长度, 记作 |A| = sqrt(A.x*A.x + A.y*A.y); 2, 向量相减产生一个新的Vector point, A - B = (A.x-B.x, A.y-B.y), 一个新的Vec point; 3, 相减后的new point,计算出模, 可以看做是A 点与 B点的距离差额(暂时理解如此); 4, 点积, 也就是相乘,A*B = A.x * B.x + A.y * B.y, 点积有个三角函数相关的 继续阅读 »
2015-06-18 刘太华
gateway的初步想法 已有一套基于epoll event的框架, 打算gateway在这个基础上, 配合boost::asio做。雏形先做个socket proxy出来. TODO: 1,设计一个AsioClient类, 它是gw到后端具体gs的连接封装. AsioClient类想到2个方案: a, 在原来的面向玩家的SClientSocket类和AsioClient类之间做friend, asio_write, asio_read, asio_connect的callback中, 回调SClientSocket中的对应Write, Read达到与epoll 事件打通, 因此打通玩家到后端gs的proxy 继续阅读 »
2015-06-12 刘太华
单线程游戏玩家数据加载方案 我们一直在使用单线程的场景服务器,基本符合由MUDOS发展而来的精简MMO场景服务的模型. 单线程的优点很明显, 安全, 简单, 逻辑清晰, 不会绕死自己的脑细胞, 避免很多多线程下的坑. 但是玩家的数据并不直接由gameserver(也就是scene server, 以下都简称gs)读取, 而是另外一个由python写的服务负责, 这个py服务负责所有玩家需要保存的数据的保存工作, 比如金币, 等级, 各种养成系统。 继续阅读 »
2015-05-20 刘太华
一次悲惨的PY注入式漏洞 在前一篇里讲过的使用cpp和python互相调用方法的结构。 这两天就有一个相关漏洞被人利用了, 异常悲惨。 我们的场景服务对每一个GameWorld都有一个PyTermWorld, 是用来接受数据服务发送过来的连接信息的, 比如可以通过协议连接socket到PyTermWorld, 发送LevelUp, 发送 AddExp等, 也有其他命令是通知PyTermWorld调用相关Python函数的, 比如send_cmd(cmd='import notify;notify.test(xxx,yyyy)') 这样的命令, 这里面的cmd会带上具体的脚本模块以及具体的python方法名称, 继续阅读 »
2015-05-18 刘太华
通过SWIG在Py里调用cpp的方法 通过Python.h接口, 在cpp里使用python脚本 经常会做改动的业务逻辑在Py里做, cpp通过SWIG暴露出某些cpp内的对象和方法,给python做调用。 同时cpp内也会有CallNoRT来调用python脚本, 完成类似闭环的调用链。 继续阅读 »
2015-05-09 刘太华
事件调度器模块 记录下我们游戏里事件调度器模块, 用处, 代码结构。 我们用来注册一些事件到调度器, 调度器在做update的时候, 会检查容器内的事件, 事件的封装, 包含senderObj, receiveObj, id, delayFrameCount等等。 如果当前帧已经符合delayFrameCount的要求了, 就执行receiveObj.RecieveEvent()方法,将senderObj注册事件时的参数等, 带入RecieveEvent方法执行。 继续阅读 »
2015-05-06 刘太华
一个单线程的epoll server示例 这个示例是一个echo server, 将回显client端send的64字节. 代码在 echoEpollServer 在OSX下 gcc 4.6, linux 下编译可用, 默认被写死了监听8886端口. 继续阅读 »
2015-04-24 刘太华
游戏服务端碰撞检测 最近看了一些游戏碰撞检测相关的一些内容,然后开始读了一些我们游戏里关于碰撞检测的代码,我们游戏里现在的碰撞检测按我暂时阅读完的代码, 应该分为2块,相对来说我们基本的碰撞检测算法是比较简单的, 后面也记录一下网上看到的关于分离轴多边形的碰撞检测。 继续阅读 »
2015-04-20 刘太华
一个自带锁的简单队列, 用单向链表实现: template class FastQueue { struct node { T element; node * next; }; node * last; node * first; LOCK m_lock; public: FastQueue() { last = 0; first = 0; } ... // 以下暂省略 继续阅读 »
2015-04-10 刘太华
网络层 一个思维导图 基本模块有: SocketBase 抽象基类, 定义所有会共性的方法, 基本都是Epoll在回调,比如OnRead, OnWrite分别处理epoll的读写事件, ListenSocket也是继承这个基类. m_fd 保存socket的fd属性 m_readBuffer 和 m_writeBuffer 分别是一个读写的buffer, 类型就是Buffer类 继续阅读 »