2011年9月8日

Herm的Allocator介绍

摘要: Allocator可以理解特定对象池。Herm目前有两种Allocator,LiteAllocator和LargeAllocator,前者支持小于120bytes的小对象;后者支持大对象,建议大于120byte以上的对象使用LargeAllocator,小对象当然也支持,但会浪费内存,每个对象将附加8bytes的内存空间。STL也可以直接用Herm的Allocator作为Allocator。LiteAllocator 在Linux其实就是__gnu_cxx::pool_alloc, Windows上直接弄成std::allocator,因为Herm的定位是开发Linux&FreeBSD 阅读全文

posted @ 2011-09-08 16:58 daemonh 阅读(171) 评论(0) 推荐(0) 编辑

2011年9月5日

作为局部变量的std::string和标准库容器一种内存优化方法

摘要: 实际项目中,往往看到好多项目把std::string, std::vector作为局部变量直接使用的情况。 类似下面std::string的用法:void SomeClass::Fun() { std::string str = "abcd"; str += "efgh"; } 下面是std::vector的类似例子:void SomeClass::Fun2() { std::vector<int> iv; iv.push_back(22); DoFun2(iv); } ... 阅读全文

posted @ 2011-09-05 22:29 daemonh 阅读(486) 评论(0) 推荐(0) 编辑

2011年8月31日

角色名字所有大区唯一的实现策略

摘要: 有的公司可能有一个专门角色名字唯一性判断的服务器,名字服务器。这个服务器的目标保证一个大区或者所有大区的名字唯一。所有大区名字唯一有一个好处是,合服的时候不会出现角色名冲突。一个大区唯一的实现策略很直接很容易。这边文章我们尝试讨论所有大区名字唯一的实现策略。先说一个直接的策略。不同大区的所有的游戏服务器都和一个名字服务器进行数据交互,客户端把创建角色请求交给游戏服务器,游戏服务器去名字服务器上判断一下这个名字是否已存在。这个策略的缺点很多,比如服务器直接耦合增加;如果大区的游戏服务器和名字服务器在不同的IDC而且之间没有专线,效率上一般也不能满足运营要求。所以大部分的项目如果用这类策略的话,一 阅读全文

posted @ 2011-08-31 16:44 daemonh 阅读(228) 评论(0) 推荐(0) 编辑

2011年8月30日

游戏服务器和__gnu_cxx::pool_alloc

摘要: pool_alloc是gnu对stl allocator一个扩展实现。位于ext/pool_allocator.h。 pool_alloc实现策略是,当分配的对象大于某个值(我的版本是120bytes)是,就直接用new&delete进行分配和释放。这个策略对于很应用是可接受的,但对于游戏服务器可能不大合适。游戏服务器中的Role(或Player)之类的,很容易超过120bytes。当然有办法避免让他达到大于120bytes。游戏服务器运行的过程中,很多时候都是Allocate&Deallocate Role的行为,这样对象Allocator就不能发挥充分的作用。像一些小对象可 阅读全文

posted @ 2011-08-30 14:44 daemonh 阅读(279) 评论(0) 推荐(0) 编辑

2011年8月29日

SNS游戏中社区Server和游戏Server一种数据交互的策略

摘要: SNS游戏和MMO类的游戏最大的区别是不分在线和离线状态。SNS游戏中存在大量的某个角色对另外一个离线角色交互。我们拿农场类游戏举例。像偷菜之类的功能都在社区Server(SS)中实现。偷菜之外,我们可以和另外一个角色进入到某个房间进行PK,最后获得经验和物品等,这类功能我们都放到游戏Server(GS)中。这里说一种简单的SS和GS数据交互的策略。1. A从SS切换到GS,GS从SS拉A的某些数据,包括BASE_EXP;2. A与B PK, A得到10点EXP, 记作DELTA_EXP,GS把DELTA_EXP发给SS;3. A退出GS,进入SS。注意看第2步,做过MMO的兄弟们一般应该是把 阅读全文

posted @ 2011-08-29 17:48 daemonh 阅读(247) 评论(0) 推荐(1) 编辑

多角色的游戏登录流程的一种优化方法

摘要: 本来是不想这类非常简单的文章的,主要是我们公司有一款大型游戏没有针对这个流程做必要的优化,导致玩家进入游戏前的一些请求给Server带来一点不必要的压力。很多游戏是一个账户下可以创建多个角色。Client 选择服务器后,一般流程:1. 拉取自己帐号下的角色列表(GET_ROLE_LIST_REQ&GET_ROLE_LIST_RES);2. 选定一个角色,进入游戏(ENTER_GAME_REQ&ENTER_GAME_RES).对应的Server流程:1. 首先从cache或DB中得到Player的所有的角色列表,列表内容肯定只包含RoleID;2. 根据RoleID从Cache或 阅读全文

posted @ 2011-08-29 14:19 daemonh 阅读(279) 评论(0) 推荐(0) 编辑

2011年8月20日

kfifo 一读一写无锁缓冲区中的memory barrier

摘要: Linux kernel实现了一个kfifo,支持一读一写线程的无锁操作。具体代码见kernel/kfifo.c。在2.6稍高一点的版本里都会涉及到memory barrier。本文稍微解释一下memory barrier。先看一下简单的两行代码: 26 bool flag = true; 27 int tmp = 10;26,27在现代的多核处理器里执行可能是并行的,实际运行过程和表面代码有点差别。在26,27前后加上memory barrier后,生成指令能保证运行顺序和代码顺序是一样的。 阅读全文

posted @ 2011-08-20 10:15 daemonh 阅读(257) 评论(0) 推荐(0) 编辑

2011年8月12日

道具设计一个灵活性方面的小细节:道具可以存放在任何地方

摘要: 实际项目中,同事的一个道具装备之类的对象要么在背包里,要么就装备到Role身上。有一个逻辑需求是道具要在背包里消失,但这个对象还需要存在。大部分人的道具模块应该能满足这个需求。但在实际工作中遇到了,我们就写点文字。可以简单实现一个ItemHolder(ItemMgr)之类的东西,维护ItemID->ItemObj。注意ItemID"不是"Item的策划配置资源静态ID。背包什么弄一个Bag对象,直接维护ItemID就可以了。上面说得那个需求,只要把ItemID从Bag里删除掉,但ItemHolder还有这个对象。如果从安全方面进一步考虑,也可以实现抽象的存放ItemI 阅读全文

posted @ 2011-08-12 10:11 daemonh 阅读(174) 评论(0) 推荐(0) 编辑

2011年8月5日

高效地使用STL

摘要: 有的公司用C++做后台服务器的不用STL,理由一般是低效。效率可能主要是和动态内存分配有关。可以用一些手段,使用STL的时候让系统在运行的过程中内存保持稳定:不出现运行时释放系统内存的行为。通过举例子说明用STL保持运行时的内存稳定。Role 抽象一个游戏角色。RoleMgr 用一个hash_map管理所有的游戏角色,一个角色进入游戏的时候,RoleMgr就拿出一个Role对象。RoleMgr可以预先分配好所有的Role对象(当然是未初始化的),也可以运行的过程不断地创建Role对象,Role对象的内存空间肯定是稳定的,就是不删除重复利用。RoleMgr重复利用内存规则,这个很多人肯定都是这样 阅读全文

posted @ 2011-08-05 10:26 daemonh 阅读(252) 评论(0) 推荐(0) 编辑

2011年6月10日

一种O1性能的LRU算法

摘要: LRU是一种淘汰算法,淘汰那些最久没被访问过的节点,以提高cache命中率。网游后台cache server经常会用到。这里说一种O1算法。先明确两个操作相关的对象1. DataKey: cache数据的key2. IndexNode: 链表节点,内部有数据的indexlist(单向链表) 保存DataKeys。hashtable(表) 以DataKey作为key, IndexNode做为值,从DataKey可以定位到IndexNode。访问一个数据对象 先用DataKey查hash,如果找到,将IndexNode从list原来的位置拿掉,然后插到尾部。 如果没找到,说明数据第一次被访问,有可 阅读全文

posted @ 2011-06-10 09:48 daemonh 阅读(435) 评论(0) 推荐(0) 编辑

导航