上一页 1 ··· 5 6 7 8 9 10 下一页
摘要: 本篇将介绍一个通用内存分配器的实现.上一篇的开头已经介绍过,这个实现是组合first fit pool和fix_obj_pool以处理不同大小的分配请求.首先看由fix_obj_pool返回的内存的头结构:struct head_fix{unsigned short idx;/*0-255,表示在fix_objs的下标*/unsigned short chunk_idx;};这个头不会返回给上层应用,是给释放内存使用的.因为内存的请求是对齐到4字节的,小于1024字节的请求,被分成256个分配大小,分别是4,8,12,....1024.每个大小的请求由一个fix_obj_pool处理.idx的 阅读全文
posted @ 2012-04-02 09:07 sniperHW 阅读(1018) 评论(0) 推荐(0) 编辑
摘要: 本篇介绍通用内存分配工具的另一个组件,first fit momery pool,也就是首次适应内存分配器。相对于best fit 算法,通常来说first fit具有更好的平均性能,具体分析可参考kunth计算机程序设计第一卷2.5的讨论.我的通用内存分配器准备组合使用fix obj pool和first fit pool.fix obj pool用于处理1-1024字节的小内存请求.这里分配的内存是对齐到4字节的.而对于1-1024字节以外的大内存块请求,将交给first fit pool处理.为了加快free时的处理效率,将对fix obj pool做一个小处理,具体将在下篇通用内存分配 阅读全文
posted @ 2012-04-02 09:06 sniperHW 阅读(1093) 评论(2) 推荐(0) 编辑
摘要: vector.h#ifndef _VECTOR_H#define _VECTOR_Hstruct vector;struct vector *vector_create(unsigned int val_size,unsigned int reserve_size);struct vector *vector_copy_create(struct vector*);void vector_copy(struct vector*,struct vector*);void vector_reserve(struct vector*,unsigned int);void vector_destroy 阅读全文
posted @ 2012-04-02 09:03 sniperHW 阅读(1279) 评论(0) 推荐(0) 编辑
摘要: 对大小固定的对象提供的对象池工具,当对内存分配的请求大小不固定时,使用其它的通用内存池.fix_obj_pool.h#ifndef _FIX_OBJ_POOL_H#define _FIX_OBJ_POOL_Hstruct fix_obj_pool;/** obj_size:对象大小* default_size:默认对象池大小* align4:返回的对象地址是否需要对齐到4字节*/extern struct fix_obj_pool *create_pool(unsigned int obj_size,int default_size,int align4);extern void destro 阅读全文
posted @ 2012-04-02 09:02 sniperHW 阅读(1306) 评论(1) 推荐(2) 编辑
摘要: 使用setjmp,longjmp实现的C与言异常处理框架。提供 抛出异常,捕获异常等功能。exception.h#ifndef _EXCEPTION_H#define _EXCEPTION_H#define except_alloc_failed 1 //内存分配失败#define except_list_empty 2 //list_pop操作,当list为空触发//............#endifexcept.h#ifndef _EXCEPT_H#define _EXCEPT_H#include <setjmp.h>#include <stdio.h>#incl 阅读全文
posted @ 2012-04-02 09:00 sniperHW 阅读(717) 评论(0) 推荐(2) 编辑
摘要: 近来考虑将项目基础框架的开发语言从C++换成C,免不了要编写一大堆的基础工具。本篇为第一篇,list,提供的接口和操作方式与std::list相似.后续将会陆续贴出map,vector,memory pool,hash_table等工具。list.h#ifndef _LIST_H#define _LIST_Hstruct list;struct node;struct fix_obj_pool;struct list_iter{ struct node **next; struct node *n;};struct fix_obj_pool *list_create_obj_poo... 阅读全文
posted @ 2012-04-02 08:55 sniperHW 阅读(1924) 评论(3) 推荐(0) 编辑
摘要: C++实现反射的一个简单实验,考虑并不充分。typelist.h#ifndef _TYPELIST_H#define _TYPELIST_Hclass NullType {};//Typelisttemplate <class T, class U>struct Typelist{ typedef T Head; typedef U Tail;};template <class TList, class T> struct IndexOf; template <class T>struct IndexOf<NullType, T>{ enum { 阅读全文
posted @ 2010-11-24 15:11 sniperHW 阅读(948) 评论(0) 推荐(0) 编辑
摘要: lua没有提供专门的调试器,但却提供了一些接口函数,用以实现你自己的调试器。下面实现了一个简单的基于命令行的lua调试器,提供一些最最基本的调试功能。这里面只用到了3个基本的lua调试函数,debug.sethook,debug.getlocal,debug.getinfo.函数的具体用法和功能可以参照lua手册。下面是简单的实现代码:Command.h#ifndef _COMMAND_H#define _COMMAND_H/*命令定义说明命令 参数start filename :启动执行一个lua文件list/l filename :显示文件内容brea... 阅读全文
posted @ 2010-07-28 17:28 sniperHW 阅读(3331) 评论(0) 推荐(0) 编辑
摘要: 经过一段时间的设计与完善,我们游戏的AI服务器已经达到了基本的性能要求,目前单个AI进程可同时运行4000+个频繁的AI对象。在前面一篇博客中已经提到过,AI服务器的主逻辑循环是单线程的,这个线程上运行了数千个用户级线程,每个用户级线程运行一个AI对象。AI对象被激活之后就会运行一段lua脚本,以实现AI逻辑.之所以采用用户级线程(windows下是fiber,linux下使用ucontext)的方案,是因为AI的实现使用了大量的远程调用,如果使用同步调用势必导致主线程的阻塞,从而影响AI服务器的性能。采用异步调用又导致了逻辑的过分复杂。而用户级线程正好解决了这些问题,向上提供了一个同步调用的 阅读全文
posted @ 2010-07-14 22:08 sniperHW 阅读(2395) 评论(1) 推荐(1) 编辑
摘要: 最近这段时间在修改服务器AI,准备将AI分配到单独的服务器中做,但为了不至于对原有架构造成太大的影响,攻击的判定,移动的判定仍然在gameserver上处理,AI服务器的角色就是根据状态选择合适的决策并向gameserver发出决策命令。例如:一个简单的AI函数可能像下面这样void onAi(){ //从视野中选择一个目标 target = findtarget(); if(target && target.distence(this) <= 10) { attack(target); }}调用attack的时候,将向gameserver发送一条攻击命令,由gamese 阅读全文
posted @ 2010-03-28 20:17 sniperHW 阅读(716) 评论(0) 推荐(1) 编辑
上一页 1 ··· 5 6 7 8 9 10 下一页