摘要: 内存池的实现内存池的使用是为了解决以下两个问题:1 内存碎片(Fragment),内存碎片会导致分配大块内存失败2 malloc和free比较慢至于为什么会有这两个问题,或者,这两个问题真的存在吗?以后再探讨,我们先关注内存池在网上google一番,wiki告诉我们,内存池包括"simple memory pool"和"Region-based_memory_management",wiki还告诉我们Nigix就是用的"Region-based_memory_management",至于"simple memory pool 阅读全文
posted @ 2014-04-05 23:52 mightofcode 阅读(631) 评论(0) 推荐(0) 编辑
摘要: 图搜索的A*算法有两种情况:hn是可采纳的,但是不是满足一致性如果满足一致性,A*算法的实现要简单一些:即使不检查closed节点的状态重复,也能得到最优的结果下面是证明最优性的一些关键点:1 沿着任何路径的fn都是非递减的2 closed集合里面的任何一个节点的fn都要小于open集合里面的任何一个节点的fn,这个特点保证了在拓展open节点时可以跳过已经在closed节点中的节点3 目标点的fn=gn+0,如果有路径到达目标点,那么所有能到达目标点的路径都在open表里面,而且A*算法必然能找到最优的那条路径 阅读全文
posted @ 2013-12-12 11:46 mightofcode 阅读(4475) 评论(0) 推荐(0) 编辑
摘要: 传教士与野人问题:三个传教士,三个野人,一条船,船最多搭载两个人,传教士和野人都能划船,如何用求解这个问题?根据的搜索算法,定义目标函数,初始状态,计算出状态空间,然后进行搜索,由于路径耗散是常量,省略了路径耗散函数这个问题的推广:nn野人问题,在n>3时是无解的#ifndef te_acrossRiver_MOC_H20132417#define te_acrossRiver_MOC_H20132417#include "te_common.h"class AcrossRiver:public Singaleton{ class StateNode { public 阅读全文
posted @ 2013-10-25 18:26 mightofcode 阅读(725) 评论(0) 推荐(0) 编辑
摘要: 最近要把cairo集成到项目中,却发现cairo不能工作了折腾了两天才找到了原因:cairo的一个trick导致浮点数计算错误:http://blog.163.com/lvan100@yeah/blog/static/6811721420131191434556/给d3dcreate加上D3DCREATE_FPU_PRESERVE之后一切正常如果我直接调cairo的代码就能早点解决这个bug了,我一直以为是我用得有问题,浪费了两天+无数脑细胞 阅读全文
posted @ 2013-07-30 16:32 mightofcode 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 简介signal是为了解决类之间通信的问题而出现的,更深入的原因是面向对象讲究封装,但是封装必然导致类之间沟通困难,但是使用接口的方式又太重量级--需要写很多代码,而且会导致接口爆炸比如你需要把一个接口拆分为两个时,你得做很多工作,这个时候signal的好处就出现了signal库signal库主要有QT的signal,boost的signal与signalslot(http://sigslot.sourceforge.net/)这里谈谈signalslot使用它需要定义signal,然后将成员函数绑定到signal上面,实现方法不外是functor带槽的类需要继承一个has_slot,可以猜到 阅读全文
posted @ 2013-06-28 17:55 mightofcode 阅读(5874) 评论(0) 推荐(0) 编辑
摘要: 本着复用轮子的精神,我把POCO库加到了我的项目里面POCO库包含了许多实用工具,可以让你免去寻找其他第三方库的的麻烦,目前我用到了里面的log,xml,format模块但是我今天却被POCO坑了因为我今天加了一些代码之后发现程序的速度变慢了,慢到不能忍的地步花了6个小时我终于找到原因了(我的上VS不是旗舰版,没有profiler,花了很长时间找问题),原来poco打一条log需要30-40ms,当你频繁打log的时候会形成严重的性能瓶颈于是我果断自己实现了一个小型的log模块替换掉POCO的log,然后世界清净了从这件事得到一个教训,使用第三方库时(特别是比较冷门的库)必须谨慎,如果要使用, 阅读全文
posted @ 2013-06-12 19:27 mightofcode 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 在D3D中渲染2D图像经常要遇到一个问题:尽管渲染出来的大小严格等于图像本身的大小,但是显示出来的图像变模糊了网上搜索一下可以找到这个问题的答案,MSDN也有这个问题的详细解释,我在这里做下总结为什么会出现这个问题?这个问题的关键是:D3D在光栅化的时候是取像素中点作为取样点,也就是说窗口坐标(0,0)处的颜色等于窗口空间(0.5,0.5)处的颜色,而不是直觉上认为的(0.0,0.0)处,据说DX10已经修改为后者,但是DX9仍然有这个问题这样在进行线性采样的时候就会去取周围四个像素的均值作为最终颜色,所以结果是模糊的如何解决:进行线性采样(或者复杂的采样)时将坐标(0.5,0.5),这是wi 阅读全文
posted @ 2013-06-08 16:18 mightofcode 阅读(866) 评论(0) 推荐(0) 编辑
摘要: c++标准库小得可怜,而仅有的那些功能还超级不好用下面是我的一些吐槽(每到不爽的时候我就来更新下):auto_ptrauto_ptr竟然不能这样用: auto_ptr<C> a=new C();这是因为auto_ptr把构造函数设成了explicit的,也就是禁止隐式转换,这么做看不出来有什么大的意义,是为了防止误用吗?auto_ptr的语义很清晰了,这都能用错那还是别用了有很多时候我都想用auto_ptr,但是我很不爽把auto_ptr<XXX>写两次,如果用auto,可以只多写4个字母,但是还是不爽stl提供的算法为什么不提供简洁的接口呢为什么我每次用find之类都 阅读全文
posted @ 2013-05-14 18:23 mightofcode 阅读(334) 评论(0) 推荐(0) 编辑
摘要: makecontext是一个变参函数,我们知道变参函数其实没有办法知道传进来的参数的类型(这就是为什么printf是类型不安全的),makecontext假定传进来大小是sizeof(int),我么有时候会需要传指针进去这种做法在64位下会有点问题,64位下指针是8字节,而int只有4字节,这时需要把指针拆成两部分,传两个参数进去,再由回调函数组装成指针详情说明见man makecontext但是今天我在64位下直接使用指针传进去也成功了,网上有这么一段话:The standard says the parameters must all be int values. This isan hi 阅读全文
posted @ 2013-05-10 12:00 mightofcode 阅读(1520) 评论(0) 推荐(0) 编辑
摘要: 标准没有对全局变量的初始化时间做出规定即使代码已经进入main函数,也不能假定全局变量已经初始化完毕编译器仅仅保证在第一次使用全局变量前已经完成初始化,而且各个全局变量之间的初始化顺序是无法确定的总结:绝对不能依赖全局变量对复杂对象进行初始化,否则是自己找坑(嗯,最近我就跳进去了) 阅读全文
posted @ 2013-04-15 21:14 mightofcode 阅读(643) 评论(0) 推荐(0) 编辑