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, 点积有个三角函数相关的
继续阅读 »
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
继续阅读 »
单线程游戏玩家数据加载方案
我们一直在使用单线程的场景服务器,基本符合由MUDOS发展而来的精简MMO场景服务的模型.
单线程的优点很明显, 安全, 简单, 逻辑清晰, 不会绕死自己的脑细胞, 避免很多多线程下的坑.
但是玩家的数据并不直接由gameserver(也就是scene server, 以下都简称gs)读取, 而是另外一个由python写的服务负责, 这个py服务负责所有玩家需要保存的数据的保存工作, 比如金币, 等级, 各种养成系统。
继续阅读 »
一次悲惨的PY注入式漏洞
在前一篇里讲过的使用cpp和python互相调用方法的结构。 这两天就有一个相关漏洞被人利用了, 异常悲惨。
我们的场景服务对每一个GameWorld都有一个PyTermWorld, 是用来接受数据服务发送过来的连接信息的, 比如可以通过协议连接socket到PyTermWorld, 发送LevelUp, 发送 AddExp等, 也有其他命令是通知PyTermWorld调用相关Python函数的, 比如send_cmd(cmd='import notify;notify.test(xxx,yyyy)') 这样的命令, 这里面的cmd会带上具体的脚本模块以及具体的python方法名称,
继续阅读 »
通过SWIG在Py里调用cpp的方法
通过Python.h接口, 在cpp里使用python脚本
经常会做改动的业务逻辑在Py里做, cpp通过SWIG暴露出某些cpp内的对象和方法,给python做调用。 同时cpp内也会有CallNoRT来调用python脚本, 完成类似闭环的调用链。
继续阅读 »
事件调度器模块
记录下我们游戏里事件调度器模块, 用处, 代码结构。
我们用来注册一些事件到调度器, 调度器在做update的时候, 会检查容器内的事件, 事件的封装, 包含senderObj, receiveObj, id, delayFrameCount等等。 如果当前帧已经符合delayFrameCount的要求了, 就执行receiveObj.RecieveEvent()方法,将senderObj注册事件时的参数等, 带入RecieveEvent方法执行。
继续阅读 »
一个单线程的epoll server示例
这个示例是一个echo server, 将回显client端send的64字节.
代码在 echoEpollServer
在OSX下 gcc 4.6, linux 下编译可用, 默认被写死了监听8886端口.
继续阅读 »
游戏服务端碰撞检测
最近看了一些游戏碰撞检测相关的一些内容,然后开始读了一些我们游戏里关于碰撞检测的代码,我们游戏里现在的碰撞检测按我暂时阅读完的代码, 应该分为2块,相对来说我们基本的碰撞检测算法是比较简单的, 后面也记录一下网上看到的关于分离轴多边形的碰撞检测。
继续阅读 »
一个自带锁的简单队列, 用单向链表实现:
template
class FastQueue
{
struct node
{
T element;
node * next;
};
node * last;
node * first;
LOCK m_lock;
public:
FastQueue()
{
last = 0;
first = 0;
}
... // 以下暂省略
继续阅读 »
网络层
一个思维导图
基本模块有:
SocketBase 抽象基类, 定义所有会共性的方法, 基本都是Epoll在回调,比如OnRead, OnWrite分别处理epoll的读写事件, ListenSocket也是继承这个基类.
m_fd 保存socket的fd属性
m_readBuffer 和 m_writeBuffer 分别是一个读写的buffer, 类型就是Buffer类
继续阅读 »