通过SWIG在Py里调用cpp的方法
通过Python.h接口, 在cpp里使用python脚本
经常会做改动的业务逻辑在Py里做, cpp通过SWIG暴露出某些cpp内的对象和方法,给python做调用。 同时cpp内也会有CallNoRT来调用python脚本, 完成类似闭环的调用链。
继续阅读 »
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成员函
继续阅读 »
这里记录的是现在所在游戏的cpp代码里的, 关于事件调度和触发的源码分析.
EventDispatcher 是一个事件调度者
Event 事件基类
EventReceiver 所有需要接收世界的对象的基类, 它们都对EventReceiver做继承. 并重写RecieveEvent方法.
继续阅读 »
第二章
转义序列: \ + 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
继续阅读 »
网络层
一个思维导图
基本模块有:
SocketBase 抽象基类, 定义所有会共性的方法, 基本都是Epoll在回调,比如OnRead, OnWrite分别处理epoll的读写事件, ListenSocket也是继承这个基类.
m_fd 保存socket的fd属性
m_readBuffer 和 m_writeBuffer 分别是一个读写的buffer, 类型就是Buffer类
继续阅读 »
一次悲惨的PY注入式漏洞
在前一篇里讲过的使用cpp和python互相调用方法的结构。 这两天就有一个相关漏洞被人利用了, 异常悲惨。
我们的场景服务对每一个GameWorld都有一个PyTermWorld, 是用来接受数据服务发送过来的连接信息的, 比如可以通过协议连接socket到PyTermWorld, 发送LevelUp, 发送 AddExp等, 也有其他命令是通知PyTermWorld调用相关Python函数的, 比如send_cmd(cmd='import notify;notify.test(xxx,yyyy)') 这样的命令, 这里面的cmd会带上具体的脚本模块以及具体的python方法名称,
继续阅读 »
游戏的cpp coding中面向对象的部分, 可能最基础的要算是状态机了, 对于一个游戏世界几乎所有物品都能看做是一个对象的实例.生物或玩家都的动作会改变自身的某些状态属性, 同时有些动作又需要玩家处于某个状态下才能进行。有限状态机是一个最基本的实现,玩家或生物等其他需求具有状态的物体都应该拥有一个自己的状态机实例。
状态机里的状态, 应该是可以互相转换的, 或者说整个状态系统, 是一个闭环。
继续阅读 »
事件调度器模块
记录下我们游戏里事件调度器模块, 用处, 代码结构。
我们用来注册一些事件到调度器, 调度器在做update的时候, 会检查容器内的事件, 事件的封装, 包含senderObj, receiveObj, id, delayFrameCount等等。 如果当前帧已经符合delayFrameCount的要求了, 就执行receiveObj.RecieveEvent()方法,将senderObj注册事件时的参数等, 带入RecieveEvent方法执行。
继续阅读 »
一个自带锁的简单队列, 用单向链表实现:
template
class FastQueue
{
struct node
{
T element;
node * next;
};
node * last;
node * first;
LOCK m_lock;
public:
FastQueue()
{
last = 0;
first = 0;
}
... // 以下暂省略
继续阅读 »
工厂类回收资源和夸线程回调时对象是否还存在判断
虽然大多数逻辑都在单线程里实现, 但是不能避免的是一些IO阻塞类型逻辑, 不得不放入子线程里执行,当IO完成后boost:bind(callback, arg1, arg2 ...) 放入主线程队列内执行callback, 但是问题是,假如callback指向的对象函数的对象, 已经销毁了, 这时候就无法判断对象是否还存在了,不判断就会core dump.
继续阅读 »