[{"data":1,"prerenderedAt":372},["ShallowReactive",2],{"blog-page-32":3,"blog-count":371},[4,68,108,230,304],{"id":5,"title":6,"body":7,"date":46,"description":13,"extension":47,"meta":48,"navigation":51,"path":63,"seo":64,"stem":65,"tags":66,"__hash__":67},"blogs\u002F_legacy\u002F2013\u002F2013-07-30-%e9%81%93%e8%b7%af%e8%bd%ac%e5%bc%af%ef%bc%8c%e7%bb%a7%e7%bb%ad%e5%89%8d%e8%a1%8c.md","道路转弯，继续前行",{"type":8,"value":9,"toc":41},"minimark",[10,14,17,20,23,26,29,32,35,38],[11,12,13],"p",{},"最近在各个方面都在发生着转变，老实说有些喘不过气来。但那不过是自己的软弱而已。",[11,15,16],{},"所以还是找些比较现实的东西来填充一下自己，今天博客又搬到新的主机上来了。之前由Hostmonster搬到了恒创上，倒也不是想黑这个主机商，只是还不到一个星期就出了两次问题，每一次网站无法访问的时间还都比较长，最后还是决定趁着7天退款期限给申请退款了。",[11,18,19],{},"之前也知道主机这一块水还是比较深的，这次算是亲身体会到了。由于各个主机商都有自己的Affliate计划，所以基本大家都会有意无意的写些软文。这就造成了对我们选择主机商的干扰，基本用搜索引擎搜到的全都是正面的评级。",[11,21,22],{},"恒创这个主机在选的时候就是这样，前几页都是正面评级，只有一篇是负面评级，只是这篇负面的黑得还是比较狠，排名也比较高。可惜当时没放到心上，完全被广大正面评级给蒙蔽了。至于恒创的主机质量到底怎样，我不清楚，只是在短短不到一周内就宕机两次，即便它平时服务器再稳定也只能说是没有缘分。",[11,24,25],{},"这里面还有一点比较让人在意的是，事后查证了下，那些推荐恒创主机的博客其实现在都并没有在使用恒创主机，虽然也有文章过时的原因在里面，还是稍稍有些让人郁闷的。",[11,27,28],{},"现在用的主机是偶然在wordpress论坛上找到的，稳定性正在测试中。感觉与其使用那些不知道根底的大型主机商，还不如找些在坛子里评价比较好的主机来用。因为至少人家小本经营，态度诚恳，不存在店大欺客的现象。",[11,30,31],{},"另外分享下经验，主机商虽然有时会声明全额退款，大家在付款的时候最好就要做好准备。如果能够像国外的主机商一样使用信用卡是最好不过，要尽可能的避免使用支付宝付款，否则在退款的时候是会被支付宝抽取3%的手续费的。不过这种事情也有没办法的时候，我这个主机就是支付宝付款的，因为只有这一种方式的。",[11,33,34],{},"这次换主机的话主要有两个原因，一个自然是Hostmonster那边的续费太贵而且下个月就到期了，这种事情如果不提前准备下的话就会手忙脚乱的。另一个原因就是自己的人生在几经周折之后算是彻底来了个转弯，之前blog这边就没有好好打理过，只是以一种挂着就挂着的心态在搞着。",[11,36,37],{},"现在的话，时间上比以前多了，也正好通过写写博文整理下自己的思路。摒除已经养成的不去思考的习惯。说来最近几年虽然是一直都有在上网，但是总感觉自己和网络有种脱节的感觉。不知道在发生什么，也不明白要去做什么。没有了一开始那种想要对什么都一探究竟的激情，虽然多少有些生活上的因素，但是这种心理状态也算是深深的植根在我的心里了。必须乘早将其拔除才行。",[11,39,40],{},"总体而言其实也都没什么，多多少少的环境变化是存在于人生的偏差里的，无论如何，只要活着，就没有不去改变的理由。",{"title":42,"searchDepth":43,"depth":44,"links":45},"",2,3,[],"2013-07-30","md",{"layout":49,"status":50,"published":51,"author":52,"author_login":53,"author_email":54,"author_url":55,"wordpress_id":56,"wordpress_url":57,"date_gmt":58,"excerpt":59},"post","publish",true,{"display_name":53,"login":53,"email":54,"url":55},"chaoshikari","chaoshikari@gmail.com","\u002F",609,"\u002F\u002F?p=609","2013-07-30 15:56:10 +0000",{"type":8,"value":60},[61],[11,62,13],{},"\u002F2013-07-30-curve-and-road",{"title":6,"description":13},"_legacy\u002F2013\u002F2013-07-30-%e9%81%93%e8%b7%af%e8%bd%ac%e5%bc%af%ef%bc%8c%e7%bb%a7%e7%bb%ad%e5%89%8d%e8%a1%8c",[],"x2tE8aFwA-D8oKnwfcx_xE85Hz9wqGpMkGxFp503z1M",{"id":69,"title":70,"body":71,"date":93,"description":75,"extension":47,"meta":94,"navigation":51,"path":103,"seo":104,"stem":105,"tags":106,"__hash__":107},"blogs\u002F_legacy\u002F2013\u002F2013-07-24-blog%e6%90%ac%e5%ae%b6%e4%ba%86.md","blog搬家了",{"type":8,"value":72,"toc":91},[73,76,79,82,85,88],[11,74,75],{},"最近在生活上发生了巨大的改变，很多方面都还没有回过味来呢。",[11,77,78],{},"其实hostmonster那边的主机还没有到期的，只是hostmonster的续费价格实在是贵的令人发指。",[11,80,81],{},"当时注册的时候就有听说主机提供商都是首年价格比较低，续费特别贵。可惜去年到续费的时候因为各种原因根本就没有去管，hostmonster自然是乐于如此，似乎是给我发了封通知自动续费的邮件。也不知道自动续费是不是默认的配置，总之我这边就这样续费了。那时也没多想啥，感觉还挺便利的。",[11,83,84],{},"没想到前天偶然到hostmonster后台看来了下，居然一年扣了我快1000块！这尼玛……我虽然一直都挂着个blog，但是基本日访问量从来没超过过50个。这也太不经纪了吧！于是果断开始各种搜寻，终于让我找到家香港主机。几番折腾之后，总算是把blog整个搬过来了。",[11,86,87],{},"虽然说这边的主机商相当明显的在公告里暗示说写软文会有优惠，但是基于个人原则，还是先测试一下这个主机的稳定性在说。况且这边访问量也不大，写软文感觉也没什么多大的作用呢。",[11,89,90],{},"现在平时的时间总算是空余的多了点的感觉，以后打算多写些东西，虽然主题不够明确不利于SEO什么的，但是又不是营销博客，还是更多的随自己的便好了。",{"title":42,"searchDepth":43,"depth":44,"links":92},[],"2013-07-24",{"layout":49,"status":50,"published":51,"author":95,"author_login":53,"author_email":54,"author_url":55,"wordpress_id":96,"wordpress_url":97,"date_gmt":98,"excerpt":99},{"display_name":53,"login":53,"email":54,"url":55},600,"\u002F\u002F?p=600","2013-07-24 04:35:00 +0000",{"type":8,"value":100},[101],[11,102,75],{},"\u002F2013-07-24-blog搬家了",{"title":70,"description":75},"_legacy\u002F2013\u002F2013-07-24-blog%e6%90%ac%e5%ae%b6%e4%ba%86",[],"x_13yNSUIAjVxxv6ZxaRqrrVd1QbT7KwubEJBfWEHRI",{"id":109,"title":110,"body":111,"date":215,"description":115,"extension":47,"meta":216,"navigation":51,"path":225,"seo":226,"stem":227,"tags":228,"__hash__":229},"blogs\u002F_legacy\u002F2013\u002F2013-07-20-vc%e4%b8%8a%e6%a3%80%e6%b5%8b%e5%86%85%e5%ad%98%e6%b3%84%e9%9c%b2%e7%9a%84%e7%a5%9e%e5%99%a8-vld.md","VC上检测内存泄露的神器——vld",{"type":8,"value":112,"toc":213},[113,116,127,130,133,140,143,153,156,204,207],[11,114,115],{},"前段在q群里聊天，发现有的童鞋和原来的我一样，不知道怎么去检查代码中的内存泄露。",[11,117,118,119,126],{},"对于我们新手而言，内存泄露的问题其实要到程序准备发布的时候才会察觉到。虽然平时总是会注意到这些问题，但是一旦项目大过某个程度，自然会出现一些无法顾及的地方。内存总是不经意的就泄露了，看着程序边跑内存边增加，着实是一件让人头痛的事情。所以这厢就来介绍下vc下检测内存泄露的优秀工具：",[120,121,125],"a",{"href":122,"rel":123},"https:\u002F\u002Fvld.codeplex.com\u002Freleases",[124],"nofollow","Visual Leak Detector","。",[11,128,129],{},"Visual Leak Detector其实是基于vc自带的检测工具工作的，虽然知道原理的情况下我们自己也可以做出一个功能类似的东西来。但是又何必再造车轮呢？vld本身是开源项目，想要知道其实现的童鞋可以看看它的代码哦。大致上似乎是基于VC++DEBUGER和CRT库提供的检测和定位内存泄漏的工具，不过作为一个有历史的开源项目，其功能自然没有简单到这种程度。",[11,131,132],{},"vld简单易用，文档也很丰富，对于内存泄露的具体位置也能以调用堆栈的形式详细的显示出来。在代码上的变动只需要简单的加上#include 就可以了。集成起来也很方便，与其他的第三方库没有区别，而且它本身只工作在debug模式，release的时候根本就不会编译，相当之便利。不知道如何配置的童鞋可以参考下面的来做，注意更改成自己的vld安装路径就好：",[11,134,135],{},[136,137],"img",{"alt":138,"src":139},"vld","\u002Fwp-content\u002Fuploads\u002F2013\u002F07\u002Fvld-300x111.jpg",[11,141,142],{},"使用下面的简单代码就可以看到vld是不是在工作：",[144,145,150],"pre",{"className":146,"code":148,"language":149},[147],"language-text","#include \"stdafx.h\"\n#include \u003Cvld.h>\n\nclass LeakTest\n{\nprivate:\n    int a;\n    float b;\npublic:\n    LeakTest(){\n        a = 4;\n        b = 3.9;\n    }\n};\n\nint _tmain(int argc, _TCHAR* argv[])\n{\n\n    LeakTest* lt = new LeakTest();\n    return 0;\n}\n","text",[151,152,148],"code",{"__ignoreMap":42},[11,154,155],{},"运行之后vs的输出栏下就会有vld的检测结果，类似下面的文字：",[157,158,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201],"blockquote",{},[11,160,161],{},"WARNING: Visual Leak Detector detected memory leaks!",[11,163,164],{},"---------- Block 1 at 0x003AFFD8: 8 bytes ----------",[11,166,167],{},"Call Stack:",[11,169,170],{},"d:\\documents\\visual studio 2012\\projects\\consoleapplication1\\consoleapplication1\\consoleapplication1.cpp (22): ConsoleApplication1.exe!wmain + 0x7 bytes",[11,172,173],{},"f:\\dd\\vctools\\crt_bld\\self_x86\\crt\\src\\crtexe.c (533): ConsoleApplication1.exe!__tmainCRTStartup + 0x19 bytes",[11,175,176],{},"f:\\dd\\vctools\\crt_bld\\self_x86\\crt\\src\\crtexe.c (377): ConsoleApplication1.exe!wmainCRTStartup",[11,178,179],{},"0x7576ED6C (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes",[11,181,182],{},"0x76EE377B (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0xEF bytes",[11,184,185],{},"0x76EE374E (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0xC2 bytes",[11,187,188],{},"Data:",[11,190,191],{},"04 00 00 00 9A 99 79 40 ......y@ ........",[11,193,194],{},"Visual Leak Detector detected 1 memory leak (44 bytes).",[11,196,197],{},"Largest number used: 44 bytes.",[11,199,200],{},"Total allocations: 44 bytes.",[11,202,203],{},"Visual Leak Detector is now exiting.",[11,205,206],{},"相当的好用吧！",[11,208,209,210],{},"vld的最新版可以到官网下载：",[120,211,122],{"href":122,"rel":212},[124],{"title":42,"searchDepth":43,"depth":44,"links":214},[],"2013-07-20",{"layout":49,"status":50,"published":51,"author":217,"author_login":53,"author_email":54,"author_url":55,"wordpress_id":218,"wordpress_url":219,"date_gmt":220,"excerpt":221},{"display_name":53,"login":53,"email":54,"url":55},595,"\u002F\u002F?p=595","2013-07-20 02:41:53 +0000",{"type":8,"value":222},[223],[11,224,115],{},"\u002F2013-07-20-vc上检测内存泄露的神器-vld",{"title":110,"description":115},"_legacy\u002F2013\u002F2013-07-20-vc%e4%b8%8a%e6%a3%80%e6%b5%8b%e5%86%85%e5%ad%98%e6%b3%84%e9%9c%b2%e7%9a%84%e7%a5%9e%e5%99%a8-vld",[],"1_tgUlUxzC9CSiWJNwiOtD43Zre7saQg_aXaPUsOA80",{"id":231,"title":232,"body":233,"date":288,"description":237,"extension":47,"meta":289,"navigation":51,"path":298,"seo":299,"stem":300,"tags":301,"__hash__":303},"blogs\u002F_legacy\u002F2013\u002F2013-05-13-cocos2d-x%e4%b8%ad%e7%9a%84%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86.md","cocos2d-x中的内存管理",{"type":8,"value":234,"toc":286},[235,238,241,244,247,253,256,262,265,271,274,280,283],[11,236,237],{},"前段和cocos2d-x的内存管理机制纠结了一阵，现在对整个过程总结整理一下。",[11,239,240],{},"cocos2d-x使用的是一套自己的引用计数系统来进行内存管理的，一般情况下我们使用creat函数来创建一个类的实例，在不需要时调用release函数进行释放。这时候有一点事需要注意的，那就是使用new来创建和creat函数创建的对象在引用计数上是不同的。如果不留心的话，就可能造成内存泄露甚至更奇特的bug。另外，如果尝试直接delete的话，将极有可能导致引擎崩溃。",[11,242,243],{},"引擎内部对引用计数的管理是这样的：",[11,245,246],{},"首先，在CCObject类的构造函数中，将引用计数初始化为1。",[144,248,251],{"className":249,"code":250,"language":149},[147],"CCObject::CCObject(void)\n:m_uAutoReleaseCount(0)\n,m_uReference(1) \u002F\u002F when the object is created, the reference count of it is 1\n,m_nLuaID(0)\n{\n    static unsigned int uObjectCount = 0;\n\n    m_uID = ++uObjectCount;\n}\n",[151,252,250],{"__ignoreMap":42},[11,254,255],{},"然后，如果是使用create函数的话就会执行一次autorelease函数，将对象添加到内存管理池中。",[144,257,260],{"className":258,"code":259,"language":149},[147],"CCSprite* CCSprite::createWithTexture(CCTexture2D *pTexture, const CCRect& rect)\n{\n    CCSprite *pobSprite = new CCSprite();\n    if (pobSprite && pobSprite->initWithTexture(pTexture, rect))\n    {\n        pobSprite->autorelease();\n        return pobSprite;\n    }\n    CC_SAFE_DELETE(pobSprite);\n    return NULL;\n}\n",[151,261,259],{"__ignoreMap":42},[11,263,264],{},"引擎内部任何会保有对象指针的操作如无例外都会自动调用retain来增加引用计数，例如ccdictionary添加元素、addchild、scheduleupdate等。",[144,266,269],{"className":267,"code":268,"language":149},[147],"void ccArrayAppendObject(ccArray *arr, CCObject* object)\n{\n    CCAssert(object != NULL, \"Invalid parameter!\");\n    object->retain();\n    arr->arr[arr->num] = object;\n    arr->num++;\n}\n",[151,270,268],{"__ignoreMap":42},[11,272,273],{},"而当一个对象的release的时候会对引用计数进行判断。",[144,275,278],{"className":276,"code":277,"language":149},[147],"void CCObject::release(void)\n{\n    CCAssert(m_uReference > 0, \"reference count should greater than 0\");\n    --m_uReference;\n\n    if (m_uReference == 0)\n    {\n        delete this;\n    }\n}\n",[151,279,277],{"__ignoreMap":42},[11,281,282],{},"使用的时候只要注意凡是自己通过new创建的对象都要自己负责release就可以了。另外需要注意的是autorelease这个操作可能会造成误解的地方，sharedPoolManager对对象的管理是一次性的，在一个帧循环之后就不会再持有对象的引用。autorelease的主要可以用于没有办法当即释放对象的情况下将释放操作保留到循环结束之后。",[11,284,285],{},"引用计数的工作方式导致了在使用多线程时需要注意的问题，由于autoreleasepool本身并不是线程安全的，所以在线程中应该避免使用create函数来创建对象。尤其小心CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(filename);这个函数内部使用了create函数创建的对象，可能会返回错误的值，照成不可预知的bug。",{"title":42,"searchDepth":43,"depth":44,"links":287},[],"2013-05-13",{"layout":49,"status":50,"published":51,"author":290,"author_login":53,"author_email":54,"author_url":55,"wordpress_id":291,"wordpress_url":292,"date_gmt":293,"excerpt":294},{"display_name":53,"login":53,"email":54,"url":55},588,"\u002F\u002F?p=588","2013-05-13 03:23:04 +0000",{"type":8,"value":295},[296],[11,297,237],{},"\u002F2013-05-13-cocos2d-x中的内存管理",{"title":232,"description":237},"_legacy\u002F2013\u002F2013-05-13-cocos2d-x%e4%b8%ad%e7%9a%84%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86",[302],"cocos2d-x","GoSle0S6X3jO01pJ3vrwYmjKENgLIVoBkaRdsjk71Oc",{"id":305,"title":306,"body":307,"date":356,"description":311,"extension":47,"meta":357,"navigation":51,"path":366,"seo":367,"stem":368,"tags":369,"__hash__":370},"blogs\u002F_legacy\u002F2013\u002F2013-04-19-cocos2d-x%e4%b8%admask%e7%9a%84%e5%ae%9e%e7%8e%b0%e5%8f%8a%e4%bc%98%e5%8c%96.md","cocos2d-x中Mask的实现及优化",{"type":8,"value":308,"toc":354},[309,312,315,318,321,327,330,336,339,345,348],[11,310,311],{},"关于cocos2d-x内的Mask来做类似光点或者视野控制等功能的思路，最早是在一篇外文上看到的。",[11,313,314],{},"拿来用过之后发现效果还是不错，于是直接放进了程序里。可是在实际运用时发现其运行效率不是那么理想，尤其是以pc平台为目标时由于配置不同造成的帧率下降比较明显。对代码进行分析之后发现，Mask的功能使用的是CCRenderTexture动态生成纹理并覆盖在目标层上的。在每一次绘制中，这个纹理都会重新生成一次，这就造成了极大的效率上的浪费。同时CCRenderTexture貌似使用了FBO，在某些旧的显卡上会引发极大的帧率丢失。",[11,316,317],{},"于是着手对其进行改造，事实上之所以要每次循环都重新生成纹理是因为mask本身的位置会不断更新。而如果打算单独使用sprite+glblencfunc来解决的话，由于绘制顺序的关系很难找到一个好的动态mask解决方案。当然准备一个大概四倍视口的mask图片是可以的，但是这样的话效率也比较低下，只能留作备选方案。",[11,319,320],{},"最终选择的解决方案是使用clippingnode，clippingnode是使用模板测试来实现的，这是gl的基础功能，不会对硬件有太大的需求。以一个CCColorlayer为Clipping的content，首先进行模板测试，然后再叠加作为遮罩的sprite就好了。",[144,322,325],{"className":323,"code":324,"language":149},[147],"        csb_st = CCSpriteBatchNode::create(\"Images\u002Fcircle.png\");\n\n        cp_board = CCClippingNode::create();\n        cp_board->setContentSize(visibleSize);\n        cp_board->setPosition(CCPointZero);\n        cp_board->setAnchorPoint(CCPointZero);\n        cp_board->setStencil(csb_st);\n        cp_board->setInverted(true);\n\n        \u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\n\n        CCLayerColor* clc = CCLayerColor::create(ccc4BFromccc4F(m_renderColor),visibleSize.width,visibleSize.height);\n        clc->setAnchorPoint(CCPointZero);\n        clc->setPosition(CCPointZero);\n        cp_board->addChild(clc);            \u002F\u002Fcontent\n        cn_borad->addChild(cp_board,m_iLaDep+1);\n\n        CC_BREAK_IF(!f_refresh_circles());\n",[151,326,324],{"__ignoreMap":42},[11,328,329],{},"sprite的话使用传说中的经典地图遮罩blend就好了：",[144,331,334],{"className":332,"code":333,"language":149},[147],"        ccBlendFunc cbf = {GL_DST_COLOR, GL_ZERO};\n\n        cns_blocks = CCSpriteBatchNode::create(\"Images\u002Fcircle.png\");\n        cns_blocks->setBlendFunc(cbf);\n        cp_board->addChild(cns_blocks);\n\n        \u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\u002F\n        m_AkaruCircle = CCSprite::create(\"Images\u002Fcircle.png\");\n        m_AkaruCircle->setBlendFunc(cbf);\n        m_AkaruCircle->setPosition(ccp(200,200));\n        m_AkaruCircle->setScale(4);\n        m_Board->addChild(m_AkaruCircle,m_iLaDep);\n",[151,335,333],{"__ignoreMap":42},[11,337,338],{},"当然，这样的话由于GLZERO的blend结果是(0,0,0,0)，如果不是做纯黑的不透明遮罩，即便精心的准备遮罩图片，多少还是会有一些违和感存在，如果出现这种情况而无法从其他方面进行修正的话，还是必须使用rendertexture。由于rendertexture的效率因素，我们必须尽量减少其负担，只是对sprite进行处理，除非需要动态改变遮罩的背景色，我们都不会对sprite进行重新生成。",[144,340,343],{"className":341,"code":342,"language":149},[147],"    ccBlendFunc cbf = {GL_ZERO, GL_ONE_MINUS_SRC_ALPHA};\n\n    CCSprite* t_sp = CCSprite::create(\"Images\u002Fcircle.png\");\n    t_sp->setPosition(CCPointZero);\n    t_sp->setAnchorPoint(CCPointZero);\n    t_sp->setBlendFunc(cbf);\n\n    CCSize vs = t_sp->getContentSize();\n    CCRenderTexture* t_crt = CCRenderTexture::create(vs.width, vs.height);\n    t_crt->beginWithClear(m_renderColor.r, m_renderColor.g, m_renderColor.b, m_renderColor.a);\n\n    t_sp->visit();\n\n    t_crt->end();\n\n    m_AkaruCircle = CCSprite::createWithTexture(t_crt->getSprite()->getTexture());\n    \u002F\u002Fm_AkaruCircle->autorelease();\n    m_AkaruCircle->setScale(4);\n    m_Board->addChild(m_AkaruCircle,m_iLaDep);\n",[151,344,342],{"__ignoreMap":42},[11,346,347],{},"这样一来Mask的总体效率就是一次模板测试加上两次spritebachnode的绘制，可以作为频繁使用CCRenderTexture的替代方案使用了。代码如下，由于目前的代码结构的关系，要测试的话spotlight类需要被继承，然后在适当的地方调用f_init才行。",[144,349,352],{"className":350,"code":351,"language":149},[147],"http:\u002F\u002Fpan.baidu.com\u002Fshare\u002Flink?shareid=418465&uk=1913549955\n",[151,353,351],{"__ignoreMap":42},{"title":42,"searchDepth":43,"depth":44,"links":355},[],"2013-04-19",{"layout":49,"status":50,"published":51,"author":358,"author_login":53,"author_email":54,"author_url":55,"wordpress_id":359,"wordpress_url":360,"date_gmt":361,"excerpt":362},{"display_name":53,"login":53,"email":54,"url":55},584,"\u002F\u002F?p=584","2013-04-19 02:36:10 +0000",{"type":8,"value":363},[364],[11,365,311],{},"\u002F2013-04-19-cocos2d-x中mask的实现及优化",{"title":306,"description":311},"_legacy\u002F2013\u002F2013-04-19-cocos2d-x%e4%b8%admask%e7%9a%84%e5%ae%9e%e7%8e%b0%e5%8f%8a%e4%bc%98%e5%8c%96",[302],"w5H-e_q5-z-K_GRIO7KBBcCSB0I-LhvGFj22Pb2c2yI",222,1788763183035]