2015-05-18 刘太华
通过SWIG在Py里调用cpp的方法 通过Python.h接口, 在cpp里使用python脚本 经常会做改动的业务逻辑在Py里做, cpp通过SWIG暴露出某些cpp内的对象和方法,给python做调用。 同时cpp内也会有CallNoRT来调用python脚本, 完成类似闭环的调用链。 继续阅读 »
2016-12-12 JustWe
cpp
Effective CPP 学习笔记 1.Cpp 是一个语言联邦 2.以const,enum,inline替换 #define 预处理器会带来诸多问题,但还是有很大的用途,所以这条仅适用于能用以上三种的情况。 3.尽可能使用const high-level const :从右至左的第一个const (* 右边 指针自身是const) low-level const :从右向左看的第二个const(* 左边 指针所指对象是const) const成员函数:const的成员函数中是不能对类本身进行改变的所以说是bitwish的,mutable可解决这个问题。 使用const成员函 继续阅读 »
2014-04-28 刘太华
这里记录的是现在所在游戏的cpp代码里的, 关于事件调度和触发的源码分析. EventDispatcher 是一个事件调度者 Event 事件基类 EventReceiver 所有需要接收世界的对象的基类, 它们都对EventReceiver做继承. 并重写RecieveEvent方法. 继续阅读 »
2016-11-10 JustWe
cpp
第二章 转义序列: \ + 1,2,3位的8进制数 或 \x + 全部的16进制数 指定字面量的类型:L'a' wchar_t , u8'hi!' utf-8 字符串字面量 变量:变量是具名的,可供程序操作的存储空间。 const: 多文件之间传递const 对象 要在初始化和定义部分都用 extern 标记 const 不允许常量引用(对常量的引用)但const能绑定非量,const能绑定const ``` c++ double dval = 3.14; const int &ri = dval; //被转化为 const int temp = dval; const int &ri 继续阅读 »
2015-04-10 刘太华
网络层 一个思维导图 基本模块有: SocketBase 抽象基类, 定义所有会共性的方法, 基本都是Epoll在回调,比如OnRead, OnWrite分别处理epoll的读写事件, ListenSocket也是继承这个基类. m_fd 保存socket的fd属性 m_readBuffer 和 m_writeBuffer 分别是一个读写的buffer, 类型就是Buffer类 继续阅读 »
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-04-02 刘太华
游戏的cpp coding中面向对象的部分, 可能最基础的要算是状态机了, 对于一个游戏世界几乎所有物品都能看做是一个对象的实例.生物或玩家都的动作会改变自身的某些状态属性, 同时有些动作又需要玩家处于某个状态下才能进行。有限状态机是一个最基本的实现,玩家或生物等其他需求具有状态的物体都应该拥有一个自己的状态机实例。 状态机里的状态, 应该是可以互相转换的, 或者说整个状态系统, 是一个闭环。 继续阅读 »
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-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-09-12 刘太华
游戏的场景服务和数据服务整合 一直以来都觉的现在运行的游戏后台服务, 实在太多了。 1,数据服务和场景服务之间的通信, 用的是消息队列zeroMQ来做的, 无形就多了一个消息队列服务, 然后还有一个处理队列任务的mq_worker, 然后数据服务到场景服务的通信. 2, 需要在每次需要的时候都建立一次本地的socket,就2个服务之间,产生了多余的好多事情。 继续阅读 »