自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

原创 关于 list 迭代器的小技巧

自己写过list 的人都知道, list 中的 节点在删除的时候 只会影响相邻的节点, 也并不会影响指向相邻节点的指针使用。std标准模板库 引入的迭代器提供了对 容器元素统一 的访问 遍历 模型。其中很多迭代器都只能是临时持有, 做完访问使用后就得析构掉。即便持有也无法保证下次使用时访问的正确。但 list 却是个例外list 的节点结构如下:template struct

2015-01-30 17:44:04 1825

原创 简单实现linux下的循环进度条

最近做加载输出的时候遇到的一个需求, 要求像linux安装包程序那样显示进度, 既按百分比显示读条。 做个windows或者控制台程序的对这个需求都不陌生。 linux其实也不复杂。 需要注意2点1 linux下的输出有缓存,如果需要回调的显示函数计数显示, 需要调用用下 fflush2 循环输出时,该行需要刷新显示的时候,要先输出同等字符数的退格符将游标回到输出起点 ,然后再输出同等

2014-12-26 10:10:47 1708

转载 Google Protocol Buffer 的使用和原理

最近在做移动平台协议的重构,搜到的这篇文章介绍得挺清楚的http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/简介什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍:Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标

2014-11-30 12:08:49 749

转载 SSL/TLS协议详解

http://www.cnblogs.com/adforce/archive/2012/11/27/2790937.html

2014-10-22 16:32:46 761

原创 windows下的协程

协程coroutine的作用主要是 在用户管理并行逻辑间的切换, 不像线程thread那样, 交由系统控制运行下 需要 锁 唤醒 条件栅栏 这中同步方式组织协作。  协程可以让用户精确控制在某个时刻下运行那块逻辑, 因为相关联的协程都在一个thread里运行, 所以不需要考虑资源互斥的那些东西,  同时协程在用户态下保留了各个寄存器,栈顶和栈底,异常信息,浮点寄存器 这种上下文信息, 让代码写

2014-09-23 14:27:11 2772 1

原创 写模板代码时需要注意头文件引入顺序

最近修改一处模板代码的时候遇到一个问题, 就是里面的全局接口buren

2014-08-25 15:36:26 1176

转载 八个常用的并行设计模式

dddzz

2014-07-18 14:31:14 3348

原创 一个值得注意的const问题

注意检查下类似的代码:

2014-06-23 12:14:56 660

原创 游戏逻辑里常用的设计模式

1 工厂方法游戏对象

2014-05-20 15:02:57 1539

原创 cpu处理结构浅谈

最近要换个cpu ,为了不被坑, 专门bu

2014-04-19 17:39:18 755

转载 MVC 框架下的中文乱码问题

最近在处理一个中文乱码问题时网上收罗了不少资料,虽然最终没能直接解决问题, 不过也提供了不少MVC模式下选择编码值得注意的地方-----------------------------------------------------------------------------------------------------------------------------------

2014-03-13 14:25:21 6466

原创 无需重编 修改程序的静态变量初始值

目前的具体应用环境就是要给发布版本的程序标记发布状态,程序经过发布工具 标记出当前的状态为  测试组版本 体验版 正式运营版 和 海外版 。程序从研发部门出去以后理论上会通过不同部门之间的配合最后跑到正式运营的环境中,能可控的限制版本的使用对发布过程很有利。 一般发布以后想要在程序内部添加或修改一个签名都需要有源码重编,但除了研发部门外其他部门显然缺乏这种环境。接下来就介绍一下如何利用coff

2014-02-10 11:54:36 1773

转载 GDB 调试指令

1. 列出源程序1.1 不带参数的list命令:   (gdb) list 或 l1.2 带一个参数的list命令:(gdb) list 1.3 带两个参数的list命令:(gdb) list 参数line1为显示的起始行,line2为结束行2. 运行程序命令:(gdb) run 或 (gdb) r 3. 操作断点的命令3.1 设置断点:

2014-01-16 11:08:52 1017

原创 如何定义 0 size 的 struct

假定定义一个文件结构时会有这种需求:某个块的数据在当前版本是不存在的,但需要标记一下便于后期版本的扩展(以下的数据都按 1 字节对齐)struct File{Head _h;SecHead _sh;Body _b;Tail _t;};而 SecHead 的结构暂时没用会想这么定义struct SecHead{};但不幸的是即便如此定义 siz

2013-12-18 16:36:04 775

原创 C++在运行状态下修改替换函数逻辑

调试代码时非常期望有改动后直接生效的函数,保持当前的环境 不用程序终止运行 重新编译这让人自然联想起脚本函数,运行时解析 这点特征使得其 在做到这点上游刃有余但今天要说的不是用脚本来实现这点,虽然过程有点曲折但纯C++代码一样也能做到这点介绍一下要用到的几个东西1 系统API void * dlopen( const char * pathname, int mode)

2013-11-21 18:11:12 3076

转载 makefile 中常见变量及函数

常用变量$(filter-out $(PHONY) $(wildcard $^),$^)常用用法为$(wildcard *.c)表示列举当前目录下的所有.c文件这里$^因为会包含依赖的文件名,如果包含的该文件存在,那么将返回其含路径的文件名所以$(wildcard $^)就是用来过滤$^包含的所有文件并且该文件确实在本地存在.自动化变量$?代表依赖文件列表中被改变过的所

2013-10-06 16:16:46 1055

原创 自旋锁 互斥锁 读写锁 递归锁

这几个锁的概念各有交叉,容易混淆互斥锁:最常使用于线程同步的锁;标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁;临界区和互斥量都可用来实现此锁,通常情况下锁操作失败会将该线程睡眠等待锁释放时被唤醒自旋锁:同样用来标记只能有一个线程访问该对象,在同一线程多次加锁操作会造成死锁;使用硬件提供的swap指令或test_and_set指令实现;

2013-09-18 18:06:45 4813

转载 MySQL与MongoDB复制群集分片设计及原理

分布式数据库能实现高安全、高性能、高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL Cluster从实现上来分析其中的设计思路,用以抽象我们在设计数据库时,可以引用的部分设计方法,应用于我们的生产系统。  首先说说关系及非关系数据库的特征:  MySQL的Innodb及Cluster拥有完整的ACID属性  A 原子性 整个事务将作

2013-08-24 18:09:13 835

原创 ACE_Recursive_Thread_Mutex 死锁bug

ACE_Recursive_Thread_Mutex 的设计目的是为了避免代码中某个线程自己递归对互斥体进行申请而变成死锁的情况但通过对其介绍文章的阅读 (参考 10.6 ACE条件变量类) 发现实现上也可能会因为线程间的竞争ACE_Thread_Mutex 和 ACE_Condition_Thread_Mutex 2个不同资源时形成互锁,代码如下int ACE_Recursive_Thr

2013-07-02 20:35:54 3824

原创 Thread Specific Storage

最近有空翻看了一下ace的网络编程卷1 ,发现ACE在针对线程私有全局变量(TLS)  有更方便使用和移植的一套设计, 命名上稍有区别Thread Specific Storage(TSS)在原有各OS TSS API的封装基础上 ,增加了使用上的方便 使用C++ 的 委托(delegation) 运算符 operator->() 让代码时显得编写更自然ACE_TSS 实现为一个模板

2013-06-19 15:06:05 782

原创 stl:vector erase 时的元素析构问题

先看一下 /user/include/c++/4.1.2/vector.tcc对 erase的实现templatetypename vector::iteratorvector::erase(iterator __postion) { if (__postion + 1 != end()) std::copy(__postion + 1, end(), __posti

2013-05-15 16:31:57 3720 1

转载 Cocos2D家族的前世今生

Cocos2D,这款用于开发2D游戏的开发框架以及由其衍生的Cocos2D-X跨平台开发框架和众多分支,正在帮助越来越多的开发者实现高效稳定的游戏开发。《程序员》近日专访了Cocos2D-iPhone作者Ricardo Quesada,请他分享Cocos2D家族的发展历程与未来方向。1973年,Ricardo Quesada出生于阿根廷。在Ricardo 12岁时,他母亲为他购

2013-04-18 11:28:35 1006

原创 轻松升级lua_tinker支持lua5.2

lua_tinker自从lua5.0出来以后就鲜有更新 ,好在5.1没有对接口作大的修改让lua_tinker平稳的过渡,但到了lua5.2 发布以后 再执行tinker 能得到的也就只有报错的提示了。关于5.2的修改 网上总结了不少,有不少宏都不用了而tinker恰好用到了其中的几个,比如LUA_GLOBALSINDEX lua_open ,如果简单的用新的宏替换掉旧的#define L

2013-03-22 15:04:54 4946 3

原创 利用模板隐藏代码中依赖关系

一个同构的逻辑在多数时候会遇到下面类似的问题:工程里面有一个系统 同时在另一个工程里面 有一个针对此系统提供的工具 并且需要实现一个简易的模拟流程。 多数的数据结构一致,业务流程也差不多一样,  最大区别在于 模拟的流程 里面不需要提供实际流程中复杂的逻辑。应对这种问题一般的方法是提供 该系统 interface 这种接口类头文件, 利用这个接口文件 可以屏蔽 复杂逻辑 工程里的 代码依赖。

2013-01-10 16:29:18 574

原创 ucs2 和 utf16

最近在处理一个跨国版本问题时 接触到 ucs2 这种字符集, unicode 的 utf8 utf16 utf32 倒是经常听说, 但工程里用的 ucs2这种倒是第一次了解。 找了一些资料发现原来 这是 不同标准制定委员会 之间产生的 命名差异 , 虽然内容一样但并没有因此废除掉其中一个,而且在标准变更时 ,这2种字符集同时按新标准更新并仍旧保持编码一致 原文如下-------------

2012-12-21 10:56:28 5752 3

原创 Thread Local Storage

Instance(单件)机制原本是让代码执行时只有一个实例,但有的时候又希望每个线程各自能有自己的"单件"相互不影响,处理类似的需求最先想到的就是全局表,然后按线程id或是管理线程的key索引到对应的单件上,取全局表的时候需要加锁。 虽然这样也能实现目的,但是代码看上去很不自然。最近发现还是有更自然的方法能实现这一点,就是 TLS 线程本地存储(Thread Local Storage)用

2012-11-16 16:43:14 6733

转载 模型驱动开发的误解和挑战

http://www.infoq.com/articles/mdd-misperceptions-challenges多年以来,采用模型驱动开发(MDD)的水平似乎仍没预期的那么好。阻碍、限制MDD使用的因素有很多,例如对实际的MDD成功案例缺乏认知、不确定如何在平常使用MDD、缺少预先投资的拨款模式、或是没有战略举措的重点。  如果你过去尝试过MDD,那你很可能遇到了一些挫折

2012-10-19 13:42:21 1545

原创 服务器开发的环境

最近由于项目原因,从原有的windows开发平台 转移到 linux下面开发, 虽然工作内容没有发生太大的改变,但原本熟悉的开发工具和调试环境通通都没有了,换来的是单调的黑屏字符一屏。 可能老早就有人说过开发服务器端的代码 终究linux才是正统。 这句话浅含的立脚点在于 服务器的程序 极少数是在 windows环境下运行的 ,所以开发理应在运行环境下做, 这样再维护代码的时候能更自然些。 道理听

2012-09-25 14:53:13 956

原创 通过栈恢复脚本函数间参数传递

最近处理了一个客户端同事的需求,大体上是这样的: 在一个脚本里调用另一个窗口的 方法 button_down 一类的, 但如果所调用窗口没有被初始化过则需要先绕到c里面去初始化这个窗口,并且通过窗口对象加载其相应的脚本( 即包含 button_down 定义 的脚本) ,然后再调用 此脚本函数。 换一种描述 就是 当函数不存在时自动加载此函数。第一反应是通过脚本做一个调用壳,在壳里实现判断 函

2012-08-11 11:24:52 731

转载 ACE的陷阱 转

ACE的陷阱坦白说,使用这个标题无非是希望能够吸引你的眼球,这篇文章的目的仅仅是为了揭示一些ACE缺陷的。文章适合的读者是对ACE(ADAPTIVE Communication Environment)有一定研究,或者正在使用ACE从事项目开发的人士参考。如果你对C++还是新手,甚至包括ACE知识初学者,(但你想飞的更高),建议你收藏这篇文档以后阅读。秉承陷阱系列文章的传统,我只是通过一些

2012-07-02 11:33:02 2533

原创 写给自己的备忘录

缺乏经验确实是导致工作需要重构的合理理由,但这并不代表这是个在工作开始前不去严谨设计的合理理由。当后续问题发生时,是否经过周密的思考就代表了这种问题能合理解决的可能性。这周这种问题越发的让人感觉明显起来。。。记得项目初期的时候和策划的头头争论过这点,那时策划的想法是公司要给3年的时间做个游戏,我们有充足的时间来试验想法,即便系统做10个砍9个,只要能做出来亮点也是有意义的。所以策划有想法的时候

2012-06-09 16:48:02 1592 1

原创 利用保护页检测内存访问越界

当处理内存越界时,如果追不到越界修改内存的地方,往往崩的时候剩下的信息都是无用的了,就算你时刻对即将出问题的数据进行监控输出,一样只能知道时间而不知道到底哪个模块引起的。vs有个数据断点的功能,但是这个功能在处理这种问题时往往不能彻底,要命的问题是 只能放 4个 ! 而且还是 4字节一个的这种。   假象一个情况,一个数组 1k长,里面出现了个越界访问你并不知道该在哪几个地址上放这个仅有的4个

2012-05-04 17:16:59 1935 1

原创 实现简易的LUA嵌套表 读写接口

最近在做副本的脚本复用机制,之前想到的是用fork 这种方式从副本的静态数据里的state下得到一个一模一样的state,从此一来省掉 open 基础的脚本库和脚本文件的操作。 实现这种方案的时候发现能省的操作还真少,网上提到的lua rings这个库事实上只能给新建了个带 基础库 的new state ,并不是和已有state 一样的clone , 脚本环境初始化的操作还是得重新做。 转头一想这

2012-04-16 11:57:15 3508

原创 如何用C++ union 来 实现一个 C# object

C#的 object 相信用过的人都能体会出它的优点, 可以  实现 任意类型的boxed,unboxed , 如下  int n = 10;   object o = n;    int m = (int) o;   在类型的传递中可以起到一个自适配的容器, 这种写法 在接口的统一 上  能起到很好的作用 , 比如你不知道如何传递一个未知类型的参数时 , 你可以在接口处定义 object 参数让

2012-03-15 18:51:08 1736

原创 itownsdk初探

最近网易的itownsdk对外发布。闲下来看看不得不说这个平台的sdk能体现针对游戏开发爱好者的耐心。友好的安装引导过后,展开的sdkbrowser事无巨细的把一个个的例子文档约定都给将来的开发者展现了出来,包括如何避免设计出不合格的游戏在内的期望也明确提出,相信能吸引到一些爱好者能融入这个开发平台。sdk里面涵盖了策划,美术,程序,制作工具,流程等一系列能想到的文档。习惯性的还是先看服务器相

2012-02-27 16:13:48 1326 1

转载 缺陷与出路

-- 专业从业者应该首先把自己从玩家的身份中升华出来,能总结玩家的反应,能将玩家眼中混沌的系统分离成为清晰的个体,能将实际抽象为理论,能将感受量化成数据。如果一个从业者的作用只是传递玩家的信息或把自己作为玩家感受的信息整理出来,那么这个从业者实质上对于整个团队是没有价值的。如果你做的仅仅是玩家能做的,那么组织要你干吗?一个2007年的反思,目前看来似乎也很应景。游戏开发与软件工程 ,表象与里象

2012-01-31 16:23:11 1461

原创 ace allocator 和 singleton 的线程安全

最近因为需要,继承实现了一个 ace_cached_allocator的分配器,理由是原本的ace_cached_allocator的实现不提供自增长的功能,当申请超过预分配的大小个数时,内存池将返回NULL。而提供动态增长的ace_local_memory_pool由于支持动态长度而显得不那么高效,项目需要的是定长的快,为专有块提供专有的memory_pool。实现起来也很简单,继承ace_ne

2012-01-18 14:43:54 889

原创 不太吸引人的成就系统

成就系统这个舶来品,成为了继副本系统之后又一个被策划要求的标配了,最近的讨论愈发觉得成就系统本身的吸引力绝大部分取决于玩家自身素质。成就在游戏里的地位,可以说是似有似无,但有充斥于任何一个边边角角的地方。说它可有可无是因为它本身的定位就是不能影响到玩家的游戏主线:比如打怪练级接任务下副本进工会搞竞技,还得承认一点成就并不是给所有玩家玩的,大部分情况下很难设计成让成就本身具有核心玩法性;说它充斥

2011-12-24 17:58:23 851

转载 Lua的function、closure和upvalue

Lua中的函数是一阶类型值(first-class value),定义函数就象创建普通类型值一样(只不过函数类型值的数据主要是一条条指令而已),所以在函数体中仍然可以定义函数。假设函数f2定义在函数f1中,那么就称f2为f1的内嵌(inner)函数,f1为f2的外包(enclosing)函数,外包和内嵌都具有传递性,即f2的内嵌必然是f1的内嵌,而f1的外包也一定是f2的外包。内嵌函数可以访问外包

2011-11-08 10:08:57 1057

原创 一步步进行 LUA的OOD封装 (二)

概要介绍了如何将lua面向过程的封装方式向面向对象的方向靠拢,这里开始逐步介绍其做法。还是以lua_tinker为主首先我们知道lua中最接近c中类概念的就是它的表,在上一页里已经介绍过他们的相似之处了,这里也就不再继续扯这个了。总体的目标是把一个C中类表述到lua中,让脚本能够识别传入的userdata是属于这个类的并且允许lua去使用这个类特定的类成员函数及其变量第一步就是给这个即

2011-10-22 16:25:31 2472

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除