??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV乱码久久精品蜜桃,久久国产一片免费观看,囯产极品美女高潮无套久久久http://cppblog.com/heath/category/10986.htmlThere is no end, it is just the beginning! - A Game Developer's Noteszh-cnTue, 20 May 2014 11:13:00 GMTTue, 20 May 2014 11:13:00 GMT60新的开?/title><link>http://www.shnenglu.com/heath/archive/2014/05/20/207029.html</link><dc:creator>Heath</dc:creator><author>Heath</author><pubDate>Tue, 20 May 2014 05:06:00 GMT</pubDate><guid>http://www.shnenglu.com/heath/archive/2014/05/20/207029.html</guid><wfw:comment>http://www.shnenglu.com/heath/comments/207029.html</wfw:comment><comments>http://www.shnenglu.com/heath/archive/2014/05/20/207029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/heath/comments/commentRss/207029.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/heath/services/trackbacks/207029.html</trackback:ping><description><![CDATA[    博客很久没有更新了,一定程度上说明自己变懒了。回近一q_开发了5q的游戏上线Q拿了工作室?q服务奖Q自׃顺理成章的变成了老h。在那些清闲的日子里Q做得最有意义的事情是每天接送老婆上下班,{着宝宝的降生。年初,l于把换工作室的计划提上日程Q流E一卡就?个月Q等?月末的时候也差不多该休陪假了Q也是说换个项目组׃q?个月的时_期间除了老项目的零星杂事外,q是有不时间来学习手游开发知识的。进入了新项目,一切都是新的,自己像当年毕业生的状态,除了dp口的担子。当Ӟ最重要的还是新生命的诞生,焦虑和兴奋充斥这整个{待q程Q??日带着双眼皮和酒H的奛_来到了h世,希望她快乐健康地成长?img src ="http://www.shnenglu.com/heath/aggbug/207029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/heath/" target="_blank">Heath</a> 2014-05-20 13:06 <a href="http://www.shnenglu.com/heath/archive/2014/05/20/207029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Real-time Cutscene中的摄像机插值研I?/title><link>http://www.shnenglu.com/heath/archive/2013/10/26/203921.html</link><dc:creator>Heath</dc:creator><author>Heath</author><pubDate>Sat, 26 Oct 2013 01:07:00 GMT</pubDate><guid>http://www.shnenglu.com/heath/archive/2013/10/26/203921.html</guid><wfw:comment>http://www.shnenglu.com/heath/comments/203921.html</wfw:comment><comments>http://www.shnenglu.com/heath/archive/2013/10/26/203921.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/heath/comments/commentRss/203921.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/heath/services/trackbacks/203921.html</trackback:ping><description><![CDATA[<p>     很多DCC工具都提供了Curves EditorQ通过控制Ҏ构造插值曲U,q样可以_地插DqV在我们游戏的过场编辑器中,我们q没有开发这cdP一斚w׃旉人力有限Q另一斚w希望能够提供一U直观简便的方式辑ֈ惌的效果。因此我们支持两U摄像机路径创徏ҎQ?Q以摄像角直接将摄像机摆到想要位|,保存此时摄像机的位置与旋转;2Q将3DS Max中的路径导出为游戏的q场格式。前者可以满?0%的过场编辑需求,后者满了10%的复杂\径编辑需求?<p>     不管使用那种方式Q都需要将L点进行插|interpolationQ以便得到^滑\径。这里就牉|C|插值和朝向插倹{?<p>     从插值函C可分Zc:1Q线性;2Q多式Q?Q样条。顾名思义Q线性插值采用线性函敎ͼ多项式插值采用多式Q而样条插值则采用了一l多式l成的分D函数。由于摄像机的关键\径点通常都会大于2个,所以插值方法上必选取hҎ?<p><font size="4" face="Arial"><strong>一、位|插?/strong></font></p> <p><font size="3"><strong>1.1 hcd选择</strong></font> <p>     在这里我们仅考虑三次h插|因ؓ它们可达到C2q箋。三ơ样条中主要以Bezier、Catmull-Rom、均匀Bh查对象Q它们都h计算开销的优点。可以通过下面公式来定义它们: <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(18)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(18)" border="0" alt="Image(18)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(18)_thumb.png" width="500" height="117"></a> <p>     化ؓQ?<p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(19)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(19)" border="0" alt="Image(19)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(19)_thumb.png" width="130" height="32"></a> <p>     下面表格列出了三U插值曲U对应的G和MQ?<p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(20)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(20)" border="0" alt="Image(20)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(20)_thumb.png" width="483" height="339"></a> <p>     如下图所C,?个点q行Bezier插值得到的曲线只会有两个点被曲U穿q,而B-Spline插值得到的曲线不会l过控制点,只有Catmull-Rom Spline可以得到I过除v点和l点之间的所有控制点。正因ؓCatmull-Romhq个Ҏ,使得它被q泛地应用在关键帧^滑插gQ因此我们选择了Catmull-Romh作ؓ摄像Z|点的插值算法?<p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(21)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(21)" border="0" alt="Image(21)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(21)_thumb.png" width="400" height="917"></a> <p><font size="3"><strong>1.2 实现</strong></font> <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image" border="0" alt="Image" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image_thumb.jpg" width="759" height="732"></a> <p><font size="3"><strong>参考:</strong></font> <p>[1] <a >Mathematics for 3D Game Programming and Computer Graphics 3e by Eric Lengyel</a> <p>[2] <a >http://en.wikipedia.org/wiki/Catmull-Rom_spline#Catmull.E2.80.93Rom_spline</a> <p>[3] <a >http://www.codeproject.com/Articles/30838/Overhauser-Catmull-Rom-Splines-for-Camera-Animatio</a> <p><font size="4"><strong>二、朝向(旋{Q插?/strong></font>   <p><font size="3"><strong>2.1 Euler Angles VS Quaternion</strong></font>         <p>     三维I间中描q旋转的主要Ҏ有Euler Angles和Quaternion。Euler Angles有三个明昄问题Q?Q三轴上的旋转顺序敏感;2QGimbal Lock现象D旋{自由度丢失;3Q独立地对三个旋转分量进行插|忽略了三轴之间的依赖关系Q导致插值结果不理想。与Euler Angles不同的是QQuaternion没有旋转分解到三个轴向上,而是用一个旋转u和绕该u的旋转角度来描述Q所以从Ҏ上消除了Euler Angles的三大问题。有关Quaternion的详l描q可参考[1]Q在此不再篏q?<p><font size="3"><strong>2.2 LERP VS SLERP</strong></font> <p>     四元数线性插|Linear Quaternion interpolationQ的计算公式为: <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(1)_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(1)" border="0" alt="Image(1)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(1)_thumb.jpg" width="510" height="306"></a> <p>     四元数球面线性插|Spherical Linear Quaternion interpolationQ的计算公式为: <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(2)_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(2)" border="0" alt="Image(2)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(2)_thumb.jpg" width="315" height="43"></a> <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(3)_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(3)" border="0" alt="Image(3)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(3)_thumb.jpg" width="221" height="138"></a> <p>     其中Qؓ两个四元数的夹角?<p>     Z方便展示Q我们考虑?D情况对角度Vq行两次插|两种法在插值效果上存在的差异,如下图(b为LERP、c为SLERPQ: <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(4)_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(4)" border="0" alt="Image(4)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(4)_thumb.jpg" width="640" height="128"></a> <p>     从图中可以看出LERP其实是对两四元数在圆上的弦进行了{分Q而SLERP则是对圆弧进行等分。由此得出的l论是,SLERP得到了比LERP更^滑的插值结果?<p>     Z保证插值曲U的C2q箋性,需要用球面四边Ş插|Spherical Quadrangle interpolationQ方法。例如,对q1和q2插|首先要用q0、q1、q2、q3计算Z个控制点QInner Quadrangle PointQ,公式如下Q?<p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(5)_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(5)" border="0" alt="Image(5)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(5)_thumb.jpg" width="286" height="79"></a> <p>     然后通过下式得到最l插值结果: <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(6)_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(6)" border="0" alt="Image(6)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(6)_thumb.jpg" width="760" height="41"></a> <p><font size="3"><strong>2.3 实现</strong></font> <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(7)_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(7)" border="0" alt="Image(7)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(7)_thumb.jpg" width="696" height="1022"></a> <p>     上面代码没有考虑两个四元C间夹角大?80的情c例如,考虑q1->q2的插D度?gt;180Q我们可以让q1->q2反向旋{2π-θQ即旋{-(2π-θ)Q根据四元数的定义[v*sin(θ/2) , cos(θ/2)]Q那么对q2q行处理变ؓ[-v*sin(θ/2) , -cos(θ/2)]。这个处理可以放在AddSplinePoint中来做: <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(8)_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(8)" border="0" alt="Image(8)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/Real-time-Cutscene_7DED/Image(8)_thumb.jpg" width="527" height="234"></a> <p><font size="3"><strong>参考:</strong></font> <p>[1] <a >Quaternions, Interpolation and Animation by EB Dam - 1998</a> <p>[2] <a >Game Engine Architecture by Jason Gregory - 2009</a> <p>[3] <a >https://theory.org/software/qfa/writeup/node12.html</a><img src ="http://www.shnenglu.com/heath/aggbug/203921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/heath/" target="_blank">Heath</a> 2013-10-26 09:07 <a href="http://www.shnenglu.com/heath/archive/2013/10/26/203921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windowsq_下针对C/C++目的内存泄漏检方?/title><link>http://www.shnenglu.com/heath/archive/2013/10/26/203920.html</link><dc:creator>Heath</dc:creator><author>Heath</author><pubDate>Sat, 26 Oct 2013 00:55:00 GMT</pubDate><guid>http://www.shnenglu.com/heath/archive/2013/10/26/203920.html</guid><wfw:comment>http://www.shnenglu.com/heath/comments/203920.html</wfw:comment><comments>http://www.shnenglu.com/heath/archive/2013/10/26/203920.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/heath/comments/commentRss/203920.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/heath/services/trackbacks/203920.html</trackback:ping><description><![CDATA[<p>     ׃语言在自动内存管理上的欠~,C/C++在内存管理上从来都是需要程序员心处理的一个方面,当项目代码上了一定规模,内存消耗和泄漏׃成ؓE序E_q行的第一大敌。如果不在项目之初就建立内存理和泄漏检机Ӟ后面蛋疼的问题就会接t而来。这文章着重讨论内存泄漏检,而内存管理与具体目cd关系密切Q后面有旉我会着重游戏项目来讨论?<p>     内存泄漏的基本步骤是:1Q包装(重蝲Q内存分?释放APIQ?Q进行内存分配时C相关信息Q地址、大、调用栈Q?Q释放时清除之前记录的对应信息;4Q程序退出时Q确保在所有内存释放操作完成之后)Q输出剩下的记录。其中,对进行分配操作是的调用栈回溯是个重点信息Q它能够帮助我们扑և内存泄漏代码?<p>     Windows中的Dbghelp库提供了丰富的调试API。StackWalk应该是进行栈回溯最直接的一U接口了Q但是它不够快。如果能先记录下调用栈上的CALL指o地址Q然后在输出日志时解析出W号Q将会大大降低检机制对E序本n性能的媄响。Dbghelp库中提供了Sym*FromAddrpdAPIQ可以通过指o地址获取函数W号Q那么剩下的是如何记录指o地址的问题了。从|上借了一张x86调用栈示意图Q如下: <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(12)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(12)" border="0" alt="Image(12)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(12)_thumb.png" width="263" height="458"></a> <p>     从图中可以看出,Callee的EBP始终指向Caller的EBPQEBP下面是指向Caller下一条指令(注意x86体系下栈的增长方向是地址Q,因此通过EBP可以回溯整个调用栈了。通过下面代码可以实现此功能: <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(13)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(13)" border="0" alt="Image(13)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(13)_thumb.png" width="512" height="335"></a> <p>     宏参数frame是个void*指针数组Q数l的大小取决于想要回溯的栈深度。内存分配和回收的包装代码如下: <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(14)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(14)" border="0" alt="Image(14)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(14)_thumb.png" width="768" height="311"></a> <p>     我们看到Q内存管理系l内部终I还是要使用语言提供的内存分?释放APIQ只要配对实C分配与释攄理,pȝ内部的无泄漏是很Ҏ保证的。在q里着重讲解原理,׃重蝲new/delete operator了。最后看一下调用栈函数W号的回溯代码: <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(15)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(15)" border="0" alt="Image(15)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(15)_thumb.png" width="1236" height="868"></a> <p>     我们用下面代码做试用例Q?<p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(16)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(16)" border="0" alt="Image(16)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(16)_thumb.png" width="537" height="567"></a> <p>     泄漏结果: <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(17)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(17)" border="0" alt="Image(17)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/WindowsCC_7CB0/Image(17)_thumb.png" width="800" height="322"></a> <p>参考: <p>[1] <a >Using DbgHelp</a> <p>[2] <a >Intel x86 Function-call Conventions - Assembly View</a><img src ="http://www.shnenglu.com/heath/aggbug/203920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/heath/" target="_blank">Heath</a> 2013-10-26 08:55 <a href="http://www.shnenglu.com/heath/archive/2013/10/26/203920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3DS Max坐标pMD3D左手pȝ单{换方?/title><link>http://www.shnenglu.com/heath/archive/2013/06/08/200890.html</link><dc:creator>Heath</dc:creator><author>Heath</author><pubDate>Sat, 08 Jun 2013 14:31:00 GMT</pubDate><guid>http://www.shnenglu.com/heath/archive/2013/06/08/200890.html</guid><wfw:comment>http://www.shnenglu.com/heath/comments/200890.html</wfw:comment><comments>http://www.shnenglu.com/heath/archive/2013/06/08/200890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/heath/comments/commentRss/200890.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/heath/services/trackbacks/200890.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://www.shnenglu.com/heath/archive/2013/06/08/200890.html'>阅读全文</a><img src ="http://www.shnenglu.com/heath/aggbug/200890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/heath/" target="_blank">Heath</a> 2013-06-08 22:31 <a href="http://www.shnenglu.com/heath/archive/2013/06/08/200890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决A*寻\中边~行走问?/title><link>http://www.shnenglu.com/heath/archive/2013/05/04/199973.html</link><dc:creator>Heath</dc:creator><author>Heath</author><pubDate>Sat, 04 May 2013 15:49:00 GMT</pubDate><guid>http://www.shnenglu.com/heath/archive/2013/05/04/199973.html</guid><wfw:comment>http://www.shnenglu.com/heath/comments/199973.html</wfw:comment><comments>http://www.shnenglu.com/heath/archive/2013/05/04/199973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/heath/comments/commentRss/199973.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/heath/services/trackbacks/199973.html</trackback:ping><description><![CDATA[<p>     用碰撞体来约束世界范围已l用得很q泛了,玩家与世界边~的交互问题也容易用撞面的法线和玩家朝向来解决。然而对于一个基于A* PathFinding的游戏,貌似q没有h去考虑和解册个问题。最初考虑q个问题Q是因ؓ游戏中加入了AWSD的移动方式,当碰到阻挡就静止不动了,加上有时L刷得与场景不太脓合,造成玩家在移动上的不爽快。考虑下图的情况,蓝色三角是角ԌU色U段l出了前q方向和l点Q游戏中配置色朝向上5m处)?<p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/988bf6b67b08_14D26/Image(9)%5B6%5D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(9)[6]" border="0" alt="Image(9)[6]" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/988bf6b67b08_14D26/Image(9)%5B6%5D_thumb.png" width="503" height="290"></a> <p>     我想了两U方案,最初的Ҏ灉|来自光线反射Q如下图所C?<p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/988bf6b67b08_14D26/Image(10)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(10)" border="0" alt="Image(10)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/988bf6b67b08_14D26/Image(10)_thumb.png" width="516" height="282"></a> <p>     因ؓL格子是u寚w的,通过法向量n可以得到b点的反射向量e'-oQ将|e'-o|限定在一个固定|此时如果e'不在L里面Q就它作ؓ新的l点。该Ҏ的实验结果不太o人满意,当角色离L较近时断l感太明显,因ؓ|e' - b|的长度较短。另外它不能处理e'在阻挡里的情况,被卡住不动的概率依然较大?<p>     W二U方案是ҎUd向在一个u向找一个可达试探点Q然后用限制了搜索空_搜烦节点?0以内Q的A*法扑ֈ一条到试探点的路径Q如下图?<p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/988bf6b67b08_14D26/Image(11)_2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="Image(11)" border="0" alt="Image(11)" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/988bf6b67b08_14D26/Image(11)_thumb.png" width="506" height="285"></a> <p>     设diff_x = l点x - LxQdiff_y = l点y - LyQ当diff_x > diff_yQ认定ؓ向x方向上移动,在这U情况下在终点y轴向上?0个格子内LC个最接近l点的无L点(U它为可达试探点Q。由于试探点与玩家当前点极有可能是直U不q通的Q而且它们不可能太q,所以用了一个将搜烦节点个数限制?0以内A*来得C条\径。该Ҏ大部分情况都能在边缘扑ֈ合理点,但如果玩家垂直面朝阻挡内Ud且不能在限制搜烦范围内找到可辄Q角色就会卡住不动,q种情况只能让玩家自己调整一下朝向了?<img src ="http://www.shnenglu.com/heath/aggbug/199973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/heath/" target="_blank">Heath</a> 2013-05-04 23:49 <a href="http://www.shnenglu.com/heath/archive/2013/05/04/199973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>toLua++的导出函数如何访问Lua Tablehttp://www.shnenglu.com/heath/archive/2013/02/12/197808.htmlHeathHeathTue, 12 Feb 2013 11:30:00 GMThttp://www.shnenglu.com/heath/archive/2013/02/12/197808.htmlhttp://www.shnenglu.com/heath/comments/197808.htmlhttp://www.shnenglu.com/heath/archive/2013/02/12/197808.html#Feedback0http://www.shnenglu.com/heath/comments/commentRss/197808.htmlhttp://www.shnenglu.com/heath/services/trackbacks/197808.html有些函数需要向luaq回多个l果Q将q些l果存在table中是理所当然的。因为toLua++已经自动生成了函数的wrapperQ所以没办法直接栈tableq回lLua。好在toLua预留了lua_Objectq个cdQ可以代表lua中的McdQ其实它只是int的typedef|了Q主要是在toLua解析E序时作为标C生tolua_tovalue调用。在C/C++函数中,需要检查一下栈是否ؓtablecdQ进行table元素的插入操作,例子函数如下Q?pre class="code">void ActorMgr::GetPlayerEntityIDs( lua_Object lua_table ) { TEntityListIt tIt ; std::list <int> result; for(int i = 0; i < ACOTOR_BUCKET_LEN ; ++i) { for(tIt =mSceneEntities[i].mEntities.begin(); tIt != mSceneEntities[i].mEntities.end( ); ++tIt ) { TActorPtr tpActor = tIt->second->mpActor ; if(tpActor ->GetActorType() == LOCAL_PLAYER) { result.push_front(tpActor->GetEntityID()); } else if (tpActor-> GetActorType() == REMOTE_PLAYER ) { result.push_back(tpActor->GetEntityID()); } } } lua_State* L = LuaVM::GetInstPtr()->mLS ; assert(lua_istable (L , -1)); std::list <int>:: iterator iter = result. begin(); for(int i = 1; iter != result .end(); ++ iter , ++i ) { lua_pushinteger(L , *iter); lua_rawseti(L , -2 , i); } lua_pop(L , 1); }

需要注意的是,如果是多个参敎ͼLua的压栈顺序是object pointer、参C左到叻I所以栈元素是函数{֐最双的参数?/p>

Heath 2013-02-12 19:30 发表评论
]]>
单想了一下《泡龙》的实现http://www.shnenglu.com/heath/archive/2012/11/27/195752.htmlHeathHeathTue, 27 Nov 2012 15:43:00 GMThttp://www.shnenglu.com/heath/archive/2012/11/27/195752.htmlhttp://www.shnenglu.com/heath/comments/195752.htmlhttp://www.shnenglu.com/heath/archive/2012/11/27/195752.html#Feedback0http://www.shnenglu.com/heath/comments/commentRss/195752.htmlhttp://www.shnenglu.com/heath/services/trackbacks/195752.html         领导最q在玩泡龙Q我也想不通ؓ什么突然又对这么古老的游戏感兴了。昨晚在地铁上,奚w我这U游戏能做吗Q我不加思考回{道Q当Ӟ简单。今天从深大地铁站出来,q个问题H然冒了出来Q到公司的\上花了几分钟思考了下实现细节。从最单的玩法开始:相同颜色的泡三个以上可以消除?

         核心数据l构我采用链表数l,相同颜色且L的泡串成一个链表。采用这U数据结构,是基于下面考虑Q?Q通过颜色划分~小搜烦区域Q?Q没有排序,没有中间插入节点的需求;3Q节省内存。当Ӟ游戏界面中的泡q是把它对应C个二l数l中Q每个元素存储一个泡对象的指针Q该对象中至包含:颜色、坐标,分倹{如下图所C:

Image(8)

         剩下需要考虑的是发射泡颜色如何产生Q如果从I关卡开始,前面可以用随机,后面p使用l计信息了。在每个链表头可以统计该堆泡开闭性、数量等Q利用这些信息可以决定发泡的颜色?

Heath 2012-11-27 23:43 发表评论
]]>
Window调试中的W号文g与源代码理http://www.shnenglu.com/heath/archive/2012/03/26/169068.htmlHeathHeathMon, 26 Mar 2012 15:10:00 GMThttp://www.shnenglu.com/heath/archive/2012/03/26/169068.htmlhttp://www.shnenglu.com/heath/comments/169068.htmlhttp://www.shnenglu.com/heath/archive/2012/03/26/169068.html#Feedback2http://www.shnenglu.com/heath/comments/commentRss/169068.htmlhttp://www.shnenglu.com/heath/services/trackbacks/169068.html    游戏开始进行第二次闭试Q这ơ参与h数较多,随之而来的便是无数的崩溃dump。虽然在自动构徏程中已l对PDB和EXE按版本号q行了保存,但由于构建操作h员手动修Ҏ建号Q出现多个版本对应相同版本号的问题,以及BUG单填写h以基U版本号而非真实版本h交的情况Q经常浪费开发h员的旉和精力去扑֯应的PDBQ降低了崩溃解决的响应速度。所以非常有必要建立一套自动化ҎQ得到dump文g后启动WinDbgq行分析时能够自动获取对应的PDB和源代码QWinDbg提供了q样一套方便实用的工具?/p>

1. 建立源代码烦?/font>

     WinDbg提供了一套用于管理pdb对应的源代码的工P位于其安装目录的srcsrv下,对VSS、SVN、CVS、Perforce提供了支持,分别对应vssindex.cmd、svnindex.cmd、cvsindex.cmd、p4index.cmdq四个perl脚本。其实,ssindex.cmd才是具体实现Q它Ҏ传入的版本控制系l标识,调用对应的perl module?

     svnindex.cmd通过/source?symbols参数来指定源代码目录和PDB目录Q?debug可输出处理的详细信息Q?user?pass提供svn账户和密码。PDB文g中有一节专门用于存放源代码文g列表及处理命令,可通过pdbstr -r -p:PdbFileName -s:srcsrv查看?

 

     svnindex.cmd /debug /source="E:\CodeBase_SVN\Client\trunk\tools\CutSceneEditor" /symbols="E:\CodeBase_SVN\Client\trunk\bin\Release\CutSceneEditor" /user="user" /pass="pwd"

 

     在执行上面命令前Q确保Perl和Subversion已经被安装且讄了PATH环境变量。该命o提取source code的服务器路径和当前RevisionQ然后写入PDB。下面是通过pdbstr获取的信息:

     Image(9)

     上面输出是经q格式化的,原始信息可以通过srctool -n查看Q?

     Image(10)

     可以看出Q原始代码\径后面跟了一条svn cat指oQ由于没有指定sourcepathQ所?targ%~省为当前\径("C:\Program Files\Debugging Tools for Windows (x64)\srcsrv"Q?nbsp;

2. 创徏W号服务?/font>

    所谓符h务器Q最单的形式是文g׃n服务器。我们?a target="_blank">symstore命oQ将1中生的pdbdC个文件共享服务器上,如:

 

     symstore.exe add /f "E:\CodeBase_SVN\Client\trunk\bin\Release\CutSceneEditor\*.pdb" /s "\\server.com\pub\Symbols" /t "CutSceneEditor" /v "Build 4171" /c "fix memory leak"

 

     该命令会ҎPDB的signature和age产生一个GUIDQƈPDB攄于以改GUID为名字的目录下:

     Image8

    当debugӞUNC路径d到_NT_SYMBOL_PATH中(如:_NT_SYMBOL_PATH=CACHE*F:\Symbols;SRV*http://msdl.microsoft.com/download/symbols;SRV*\\server.com\pub\SymbolsQ,调试器会自动到指定的W号服务器上L索对应的pdb文g?

     symstore大大化了W号的版本管理问题,关于它的详细介绍可参?a target="_blank">symstore介绍?

     值得注意的是Qsymstore没有锁机Ӟq不支持多h同时操作。实际情况中Q也只有自动构徏时才会做此操作?

3. 使用WinDbg分析Dump文g

      我们在代码中加入发生异常写MiniDump的功能,在程序崩溃时产生dump文g。在使用WinDbg分析dump文gӞ需要设|Symbol File Path和Source File PathQ也可以直接讄环境变量_NT_SYMBOL_PATH和_NT_SOURCE_PATH。在讄_NT_SOURCE_PATH时?SRV*CachePath"表C启用代码提取功能,执行svn cat写入到CachePath指定的目录,否则用原始\径。此后,通过点击Call Stack中的函数调用便会触发从svnd对应代码的操作(通常会有一个安全警告窗口弹出)?

     对于使用WinDbgq行调试在此׃多讲了,推荐一本不错的书《Advanced Windows Debugging》?

 

参考资?/strong>

[1] Source Indexing and Symbol Servers: A Guide to Easier Debugging

[2] Source Server Helps You Kill Bugs Dead In Visual Studio 2005



Heath 2012-03-26 23:10 发表评论
]]>
Hierarchical Path-Findinghttp://www.shnenglu.com/heath/archive/2011/11/12/159984.htmlHeathHeathSat, 12 Nov 2011 04:50:00 GMThttp://www.shnenglu.com/heath/archive/2011/11/12/159984.htmlhttp://www.shnenglu.com/heath/comments/159984.htmlhttp://www.shnenglu.com/heath/archive/2011/11/12/159984.html#Feedback0http://www.shnenglu.com/heath/comments/commentRss/159984.htmlhttp://www.shnenglu.com/heath/services/trackbacks/159984.html     ?a >Near Optimal Hierarchical Path-Finding》中提出了一U层ơA*法Q正好能够用于解决项目大地图寻\的问题。大致思\是:1Q预处理。将地图划分为nxn大小的区块,扑և每个区块与周围四个区块在边界上的互通点Q在区块中用局部A*Ҏ出的点做q通性测试ƈ其保存下来Q?Q寻路时Q用预处理得到的数据(边界上的可通点与区块内部的互通点Q,先在区块层上做一ơA*Q根据结果再在每个区块中使用局部A*扑ֈ区块与区块之间的路径Q最l得到完整\径?

一、A* Path-Finding

     A*法׃多讲了,可参考:

     A*法的优化可从搜索节点储存和OpenList排序两方面入手?

二、预处理

     每个盔R区块QC1和C2Q都有一条由公共边,该边两侧格l成L1和L2Q则q通点集E满下列条gQ?

  • E ?L1 ?L2
  • ∀t ?L1 ?L2 : t ?E ?symm(t) ?E Q其中symm(t)为对U关p?
  • E不含不可行走格子
     对在E中且同边的连l格子取其中点,如下图所C:

Image(6)

    对上面得到的位于同一区块的点集合使用local A*做连通性测试,下图用直U连接来表示两点互通:

Image(7)

三、寻?/font>

     使用区块q通信息,q行区块UA*Q得到区块之间的q接点,如果在预处理时保存了区块内互通点的\径,׃必再q行区块内的local A*了?

     实验l果表明Q在未采用区块内预存路径的情况下Q中长距d路用层ơA*后的q_效率是普通A*?倍以上,距离长效率Ҏ明显?

image

     A* 93ms

image

HPA* 15ms

     从上图中可以看出QHPA*得到的\径ƈ不是最优的Q它是在最优和效率上的折中Q适合作ؓ长距d路的一U优化方案?

四、优化点

  • 可扩展ؓ多层而不仅限于一?
  • 预存区块内连通点路径
  • 区块边界可通面U较大时Q生不自然路径Q如下图所C:

image

          一个改q的Ҏ是对q长的边界再做划分:

Image(5)



Heath 2011-11-12 12:50 发表评论
]]>
修正D3DXQuaternionSquad不能正确处理反向Quaternions的BUGhttp://www.shnenglu.com/heath/archive/2011/08/21/154037.htmlHeathHeathSun, 21 Aug 2011 14:16:00 GMThttp://www.shnenglu.com/heath/archive/2011/08/21/154037.htmlhttp://www.shnenglu.com/heath/comments/154037.htmlhttp://www.shnenglu.com/heath/archive/2011/08/21/154037.html#Feedback0http://www.shnenglu.com/heath/comments/commentRss/154037.htmlhttp://www.shnenglu.com/heath/services/trackbacks/154037.html微YDX库里提供了对Quaternionq行球面四边形内插的接口Q能够在多个Quaternion之间qx插倹{这里涉及到两个接口Q?/p>
void D3DXQuaternionSquadSetup(
  __out  D3DXQUATERNION *pAOut,
  __out  D3DXQUATERNION *pBOut,
  __out  D3DXQUATERNION *pCOut,
  __in   const D3DXQUATERNION *pQ0,
  __in   const D3DXQUATERNION *pQ1,
  __in   const D3DXQUATERNION *pQ2,
  __in   const D3DXQUATERNION *pQ3
);
D3DXQUATERNION* D3DXQuaternionSquad(
  __inout  D3DXQUATERNION *pOut,
  __in     const D3DXQUATERNION *pQ1,
  __in     const D3DXQUATERNION *pA,
  __in     const D3DXQUATERNION *pB,
  __in     const D3DXQUATERNION *pC,
  __in     FLOAT t
);
其中QD3DXQuaternionSquadSetup用于q回内插的控制点。它们具体的实现公式和用法,有兴的同学可以参考MSDN。在此需要说明的是,
D3DXQuaternionSquad使用了Slerp作ؓ内部实现Q会D在两个夹角ؓ180左右的Quaternion之间插g出现断裂的问题。下面代码通过
实现一个考虑了上q情늚Slerp版本Q在q1和q2夹角?或?80Ӟ使用U性内插而非球面Q来解决该问题?/pre>
  1. Quaternion QuatSlerpNoInvert(const Quaternion& q1 , const Quaternion& q2 , float t)
  2. {
  3.     float cosAngle = DotProduct(q1, q2);
  4.  
  5.     float c1, c2;
  6.     // Linear interpolation for close orientations
  7.     if ((1.0f - fabs(cosAngle)) < 1e-5f)
  8.     {
  9.         c1 = 1.0f - t;
  10.         c2 = t;
  11.     }
  12.     else
  13.     {
  14.         // Spherical interpolation
  15.         float angle    = acos(fabs(cosAngle));
  16.         float sinAngle = sin(angle);
  17.         c1 = sin(angle * (1.0f - t)) / sinAngle;
  18.         c2 = sin(angle * t) / sinAngle;
  19.     }
  20.  
  21.     Quaternion q = q1 * c1 + q2 * c2;
  22.     q.Normalize();
  23.  
  24.     return q;
  25. }
  26.  
  27. Quaternion QuatSquad(const Quaternion& p1 , const Quaternion& p2 , const Quaternion& p3 , const Quaternion& p4 , float t)
  28. {
  29.     static Quaternion a , b , c;
  30.  
  31.     D3DXQuaternionSquadSetup((D3DXQUATERNION*)&a , (D3DXQUATERNION*)&b , (D3DXQUATERNION*)&c ,
  32.         (D3DXQUATERNION*)&p1 , (D3DXQUATERNION*)&p2 , (D3DXQUATERNION*)&p3 , (D3DXQUATERNION*)&p4);
  33.  
  34.     return QuatSlerpNoInvert(QuatSlerpNoInvert(p2 , c , t) , QuatSlerpNoInvert(a , b , t) , 2 * t * (1-t));
  35. }

 

参考:

[1] http://msdn.microsoft.com/en-us/library/bb205419(v=vs.85).aspx

[2] http://msdn.microsoft.com/en-us/library/bb205420(v=vs.85).aspx



Heath 2011-08-21 22:16 发表评论
]]>一个QTE原型框架http://www.shnenglu.com/heath/archive/2011/08/13/153251.htmlHeathHeathSat, 13 Aug 2011 02:25:00 GMThttp://www.shnenglu.com/heath/archive/2011/08/13/153251.htmlhttp://www.shnenglu.com/heath/comments/153251.htmlhttp://www.shnenglu.com/heath/archive/2011/08/13/153251.html#Feedback4http://www.shnenglu.com/heath/comments/commentRss/153251.htmlhttp://www.shnenglu.com/heath/services/trackbacks/153251.html本文主要Ҏ自己在项目中开发的QTEpȝQ介l一个相Ҏ较简单的原型框架?nbsp; 阅读全文

Heath 2011-08-13 10:25 发表评论
]]>
法优化&mdash;&mdash;递归到@?/title><link>http://www.shnenglu.com/heath/archive/2011/03/05/141160.html</link><dc:creator>Heath</dc:creator><author>Heath</author><pubDate>Sat, 05 Mar 2011 05:42:00 GMT</pubDate><guid>http://www.shnenglu.com/heath/archive/2011/03/05/141160.html</guid><wfw:comment>http://www.shnenglu.com/heath/comments/141160.html</wfw:comment><comments>http://www.shnenglu.com/heath/archive/2011/03/05/141160.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/heath/comments/commentRss/141160.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/heath/services/trackbacks/141160.html</trackback:ping><description><![CDATA[<p>     递归通常很直白地描述了一个求解过E,因此也是最Ҏ被想到和实现的算法。@环其实和递归h相同的特性(卻I做重复Q务)Q但有时Q用@环的法q不会那么清晰地描述解决问题步骤。单从算法设计上看,递归和@环ƈ无优劣之别。然而,在实际开发中Q因为函数调用的开销Q递归常常会带来性能问题Q特别是在求解规模不定的情况下。而@环因为没有函数调用开销Q所以效率会比递归高。除数~程语言寚w归q行了优化外Q大部分语言在实现递归法时还是十分笨拙,由此带来了如何将递归法转换为@环算法的问题。算法{换应当徏立在Ҏ解过E充分理解的基础上,有时甚至需要另辟蹊径? <p>     前段旉遇到q这L问题Q已知一2D地图格子的长宽(w、hQ及每个格子的边长(aQ格子ؓ正方形)Q给定物体的2D坐标Qpos[x , y]Q及半径QrQ,求解物体?D地图格子中所占的格子Q仅考虑n*n的情c大概的求解q程如下Q? <p>1Q根据半径,定n*n中的n。假定计公式ؓQn = Round(2*r / a) <p>2Q根?D坐标得到物体的“中心格子”。根据n的奇Ӟ计算公式不同Q如下图所C? <p align="center"><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/e7377895b269_9CB8/image_10.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/e7377895b269_9CB8/image_thumb_4.png" width="239" height="244"></a>                  <a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/e7377895b269_9CB8/image_12.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/e7377895b269_9CB8/image_thumb_5.png" width="240" height="244"></a></p> <p align="center">n为偶数[1]                                                                    n为奇数[2]</p> <p>[1]Qgrid(x , y) = Round(pos / a) <p>[2]Qgrid(x , y) = Floor(pos / a) <p>其中Q格子坐标x >= 0 , y >= 0? <p>3Q以“中心格子”ؓ基础Q求出物体占据的其他格子。这L描述Q让人容易想到递归Q就像用深度优先Ҏ遍历树那P伪代码算法如下:</p> <div style="padding-bottom: 0px; padding-left: 0px; width: 1032px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:866d37ab-87f1-4aea-9d49-b7235fcfb0e9" class="wlWriterEditableSmartContent"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #0000FF;">if</span><span style="color: #000000;"> n is even { get the index of </span><span style="color: #800000;">'</span><span style="color: #800000;">center grid</span><span style="color: #800000;">'</span><span style="color: #000000;"> (row , col) ExtendHeldGrid(row , col , n) ExtendHeldGrid(row </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , col , n) ExtendHeldGrid(row </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , col </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , n) ExtendHeldGrid(row , col </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , n) } </span><span style="color: #0000FF;">else</span><span style="color: #000000;"> { get the index of </span><span style="color: #800000;">'</span><span style="color: #800000;">center grid</span><span style="color: #800000;">'</span><span style="color: #000000;"> (row , col) ExtendHeldGrid(row , col , n) } </span><span style="color: #0000FF;">function</span><span style="color: #000000;"> ExtendHeldGrid(row , col , level) { </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(level </span><span style="color: #000000;"><=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">) </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">if</span><span style="color: #000000;">((row </span><span style="color: #000000;">>=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;"> </span><span style="color: #0000FF;">and</span><span style="color: #000000;"> row </span><span style="color: #000000;"><</span><span style="color: #000000;"> MaxGridWidth) </span><span style="color: #0000FF;">and</span><span style="color: #000000;"> (col </span><span style="color: #000000;">>=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;"> </span><span style="color: #0000FF;">and</span><span style="color: #000000;"> col </span><span style="color: #000000;"><</span><span style="color: #000000;"> MaxGridHeight)) { mark the grid(row , col) ExtendHeldGrid(row , col , level </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">) </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(level </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;"> </span><span style="color: #000000;">></span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">) { ExtendHeldGrid(row </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , col , level </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">) ExtendHeldGrid(row </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , col , level </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">) ExtendHeldGrid(row , col </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , level </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">) ExtendHeldGrid(row , col </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , level </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">) ExtendHeldGrid(row </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , col </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , level </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">) ExtendHeldGrid(row </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , col </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , level </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">) ExtendHeldGrid(row </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , col </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , level </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">) ExtendHeldGrid(row </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , col </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> , level </span><span style="color: #000000;">-</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">) } } } </span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>虽然Q该法得到了正的求解l果Q但是由于每个格子都会标记周围的8个格子,所以存在大量的重复Q再者如果上面的q程每都进行的话,函数调用开销也是相当可观?/p> <p>循环自然是不可避免的Q消除重复便成了优化的目标。分析格子图和n??的情况,试图扑և用@环代曉K归的方法,我发C下面一个有的规律Q?/p> <p align="center"><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/e7377895b269_9CB8/image_16.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/e7377895b269_9CB8/image_thumb_7.png" width="239" height="244"></a>                <a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/e7377895b269_9CB8/image_18.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/e7377895b269_9CB8/image_thumb_8.png" width="240" height="244"></a></p> <p>从“中心格子”出发,时针(或逆时针)以上图方式可以走遍所求解的每个格子而不重复。在实现上,每个转角也是有规律的Q可以通过一?*2的{角矩阉|控制Q?/p> <p align="center">[1 , 0][0 , -1]</p> <p align="center">[0 , 1][-1 , 0]</p> <p align="center">时针方式的转角?/p> <p align="left"> </p> <p>矩阵中的每个元素代表从当前格子走C个格子在row和col上的变化。加之,在{角之间的路长Q以格子个数计)有每转两ơ递增单位1的规律,法׃隑־CQ下面同样以伪代码示Q?/p> <div style="padding-bottom: 0px; padding-left: 0px; width: 1032px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:c1053f9b-292c-4f91-b901-a530b31c17c3" class="wlWriterEditableSmartContent"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">conerMat </span><span style="color: #000000;">=</span><span style="color: #000000;"> { {</span><span style="color: #800080;">0</span><span style="color: #000000;"> , </span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">} , {</span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;"> , </span><span style="color: #800080;">0</span><span style="color: #000000;">} , {</span><span style="color: #800080;">0</span><span style="color: #000000;"> , </span><span style="color: #800080;">1</span><span style="color: #000000;">} , {</span><span style="color: #800080;">1</span><span style="color: #000000;"> , </span><span style="color: #800080;">0</span><span style="color: #000000;">} } dir </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;"> </span><span style="color: #000000;">///</span><span style="color: #000000;"> 转角控制Q四个{角顺旉0~</span><span style="color: #800080;">3</span><span style="color: #000000;"> span </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> </span><span style="color: #000000;">///</span><span style="color: #000000;"> 转角间的跨度 count </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> </span><span style="color: #000000;">///</span><span style="color: #000000;"> 每两ơ增加一个跨? rin </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> </span><span style="color: #000000;">///</span><span style="color: #000000;"> 下一个{角的循环索引 </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> n is even get the index of </span><span style="color: #800000;">'</span><span style="color: #800000;">center grid</span><span style="color: #800000;">'</span><span style="color: #000000;"> (row , col) </span><span style="color: #0000FF;">else</span><span style="color: #000000;"> get the index of </span><span style="color: #800000;">'</span><span style="color: #800000;">center grid</span><span style="color: #800000;">'</span><span style="color: #000000;"> (row , col) </span><span style="color: #0000FF;">for</span><span style="color: #000000;">(i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;"><</span><span style="color: #000000;"> n </span><span style="color: #000000;">*</span><span style="color: #000000;"> n; </span><span style="color: #000000;">++</span><span style="color: #000000;">i) { </span><span style="color: #0000FF;">if</span><span style="color: #000000;">((row </span><span style="color: #000000;">>=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;"> </span><span style="color: #0000FF;">and</span><span style="color: #000000;"> row </span><span style="color: #000000;"><</span><span style="color: #000000;"> MaxGridWidth) </span><span style="color: #0000FF;">and</span><span style="color: #000000;"> (col </span><span style="color: #000000;">>=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;"> </span><span style="color: #0000FF;">and</span><span style="color: #000000;"> col </span><span style="color: #000000;"><</span><span style="color: #000000;"> MaxGridHeight)) mark the grid(row , col) </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(i </span><span style="color: #000000;">==</span><span style="color: #000000;"> rin) { dir </span><span style="color: #000000;">=</span><span style="color: #000000;"> (dir </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;">) </span><span style="color: #000000;">%</span><span style="color: #000000;"> </span><span style="color: #800080;">4</span><span style="color: #000000;"> </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(count </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800080;">2</span><span style="color: #000000;">) { </span><span style="color: #000000;">++</span><span style="color: #000000;">span count </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> } </span><span style="color: #0000FF;">else</span><span style="color: #000000;"> </span><span style="color: #000000;">++</span><span style="color: #000000;">count rin </span><span style="color: #000000;">=</span><span style="color: #000000;"> i </span><span style="color: #000000;">+</span><span style="color: #000000;"> span } row </span><span style="color: #000000;">=</span><span style="color: #000000;"> row </span><span style="color: #000000;">+</span><span style="color: #000000;"> conerMat[dir][</span><span style="color: #800080;">0</span><span style="color: #000000;">] col </span><span style="color: #000000;">=</span><span style="color: #000000;"> col </span><span style="color: #000000;">+</span><span style="color: #000000;"> conerMat[dir][</span><span style="color: #800080;">1</span><span style="color: #000000;">] } </span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>用MFCE序验证了一下算法的正确性,标号展示了@环的路线Q注意GDI的坐标系中Y的正方向朝下Q:</p> <p><a href="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/e7377895b269_9CB8/image_20.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://www.shnenglu.com/images/cppblog_com/heath/Windows-Live-Writer/e7377895b269_9CB8/image_thumb_9.png" width="863" height="510"></a></p><img src ="http://www.shnenglu.com/heath/aggbug/141160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/heath/" target="_blank">Heath</a> 2011-03-05 13:42 <a href="http://www.shnenglu.com/heath/archive/2011/03/05/141160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下Perforce Command Line处理中文参数的两U方?/title><link>http://www.shnenglu.com/heath/archive/2010/11/15/133692.html</link><dc:creator>Heath</dc:creator><author>Heath</author><pubDate>Mon, 15 Nov 2010 09:58:00 GMT</pubDate><guid>http://www.shnenglu.com/heath/archive/2010/11/15/133692.html</guid><wfw:comment>http://www.shnenglu.com/heath/comments/133692.html</wfw:comment><comments>http://www.shnenglu.com/heath/archive/2010/11/15/133692.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/heath/comments/commentRss/133692.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/heath/services/trackbacks/133692.html</trackback:ping><description><![CDATA[<p>    Windows下Command Line中的中文字符是采用ANSI~码来处理的Q而Perforce command line要求传入的中文参敎ͼ文gQ夹Q名QؓUTF-8~码Q所以需要将中文参数转换为UTF-8后再做处理,下面介绍两种处理Ҏ?/p> <p>一、系l调?/p> <p>    通过使用WinExec、ShellExecute或systemQ如Q?/p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:a202efe8-f955-49cf-8f11-16a2b3b1f36b" class="wlWriterEditableSmartContent"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #008080;">_snprintf</span><span style="color: #000000;">(cmdbuf , </span><span style="color: #800080;">1024</span><span style="color: #000000;"> , </span><span style="color: #800000;">"</span><span style="color: #800000;">p4 -c %s add \</span><span style="color: #800000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">s\</span><span style="color: #800000;">""</span><span style="color: #000000;"> , argv[</span><span style="color: #800080;">1</span><span style="color: #000000;">] , ANSIToUTF8(path.c_str())); system(cmdbuf);</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>    此方法的虽然单,但存在效率问题,因ؓ有创E的巨大开销。此外不同版本的Perforce也会出现不同的执行结果,针对特定的中文会出现操作p|的诡异问题?/p> <p>二、Perforce SDK</p> <p>    Perforce提供有SDK用以扩展或集成到其他应用中,虽然没有详细的文档,但可以通过学习SDK中的sample文g来学习,此方法最E_?/p> <p>    下面代码展示了通过SDK中ClientAPI来递归d指定文g夹下的所有文Ӟ</p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:891e1b70-295a-4daf-9c0d-8f0ad2ef8b07" class="wlWriterEditableSmartContent"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;">#</span><span style="color: #000000;"> include </span><span style="color: #800000;">"</span><span style="color: #800000;">clientapi.h</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">#</span><span style="color: #000000;"> include </span><span style="color: #800000;">"</span><span style="color: #800000;">i18napi.h</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">#</span><span style="color: #000000;"> include </span><span style="color: #800000;">"</span><span style="color: #800000;">CharSetConvertUtil.h</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">#</span><span style="color: #000000;"> include </span><span style="color: #000000;"><</span><span style="color: #000000;">string</span><span style="color: #000000;">></span><span style="color: #000000;"> </span><span style="color: #000000;">#</span><span style="color: #000000;"> include </span><span style="color: #000000;"><</span><span style="color: #000000;">vector</span><span style="color: #000000;">></span><span style="color: #000000;"> </span><span style="color: #000000;">#</span><span style="color: #000000;"> include </span><span style="color: #000000;"><</span><span style="color: #000000;">list</span><span style="color: #000000;">></span><span style="color: #000000;"> </span><span style="color: #000000;">#</span><span style="color: #000000;"> include </span><span style="color: #000000;"><</span><span style="color: #000000;">io.h</span><span style="color: #000000;">></span><span style="color: #000000;"> using namespace std; </span><span style="color: #000000;">//</span><span style="color: #000000;"> structure to hold a directory </span><span style="color: #0000FF;">and</span><span style="color: #000000;"> all its filenames. struct FILELIST { string path; vector</span><span style="color: #000000;"><</span><span style="color: #000000;">string</span><span style="color: #000000;">></span><span style="color: #000000;"> theList; }; void TransverseDirectory(string path, list</span><span style="color: #000000;"><</span><span style="color: #000000;">FILELIST</span><span style="color: #000000;">></span><span style="color: #000000;">& theList) { struct </span><span style="color: #008080;">_finddatai</span><span style="color: #000000;">64</span><span style="color: #008080;">_t</span><span style="color: #000000;"> data; string fname </span><span style="color: #000000;">=</span><span style="color: #000000;"> path </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">\\*.*</span><span style="color: #800000;">"</span><span style="color: #000000;">; long h </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">_findfirsti</span><span style="color: #800080;">64</span><span style="color: #000000;">(fname.c_str(),&data); </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(h </span><span style="color: #000000;">>=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">) { FILELIST thisList; theList.push_back(thisList); list</span><span style="color: #000000;"><</span><span style="color: #000000;">FILELIST</span><span style="color: #000000;">></span><span style="color: #000000;">::iterator it </span><span style="color: #000000;">=</span><span style="color: #000000;"> theList.</span><span style="color: #0000FF;">end</span><span style="color: #000000;">(); it</span><span style="color: #008000;">--</span><span style="color: #008000;">;</span><span style="color: #008000;"> </span><span style="color: #000000;"> (</span><span style="color: #000000;">*</span><span style="color: #000000;">it).path </span><span style="color: #000000;">=</span><span style="color: #000000;"> path; </span><span style="color: #0000FF;">do</span><span style="color: #000000;"> { </span><span style="color: #0000FF;">if</span><span style="color: #000000;">( (data.attrib & </span><span style="color: #008080;">_A_SUBDIR</span><span style="color: #000000;">) ) { </span><span style="color: #000000;">//</span><span style="color: #000000;"> make sure we skip </span><span style="color: #800000;">"</span><span style="color: #800000;">.</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #0000FF;">and</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">..</span><span style="color: #800000;">"</span><span style="color: #000000;">. Have to use strcmp here because </span><span style="color: #000000;">//</span><span style="color: #000000;"> some file names can start with a dot, so just testing </span><span style="color: #0000FF;">for</span><span style="color: #000000;"> the </span><span style="color: #000000;">//</span><span style="color: #000000;"> first dot is </span><span style="color: #0000FF;">not</span><span style="color: #000000;"> suffient. </span><span style="color: #0000FF;">if</span><span style="color: #000000;">( strcmp(data.name,</span><span style="color: #800000;">"</span><span style="color: #800000;">.</span><span style="color: #800000;">"</span><span style="color: #000000;">) !</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;"> &&strcmp(data.name,</span><span style="color: #800000;">"</span><span style="color: #800000;">..</span><span style="color: #800000;">"</span><span style="color: #000000;">) !</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">) { </span><span style="color: #000000;">//</span><span style="color: #000000;"> We found a sub</span><span style="color: #000000;">-</span><span style="color: #000000;">directory, so get the files </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> it too fname </span><span style="color: #000000;">=</span><span style="color: #000000;"> path </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">\\</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> data.name; </span><span style="color: #000000;">//</span><span style="color: #000000;"> recurrsion here! TransverseDirectory(fname,theList); } } </span><span style="color: #0000FF;">else</span><span style="color: #000000;"> { </span><span style="color: #000000;">//</span><span style="color: #000000;"> this is just a normal filename. So just add it to our vector (</span><span style="color: #000000;">*</span><span style="color: #000000;">it).theList.push_back(data.name); } }</span><span style="color: #0000FF;">while</span><span style="color: #000000;">( </span><span style="color: #008080;">_findnexti</span><span style="color: #800080;">64</span><span style="color: #000000;">(h,&data) </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">); </span><span style="color: #008080;">_findclose</span><span style="color: #000000;">(h); } } int main( int argc, char </span><span style="color: #000000;">**</span><span style="color: #000000;">argv ) { list</span><span style="color: #000000;"><</span><span style="color: #000000;">FILELIST</span><span style="color: #000000;">></span><span style="color: #000000;"> MyList; string path; ClientUser ui; ClientApi client; StrBuf msg; Error e; </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(argc </span><span style="color: #000000;"><</span><span style="color: #000000;"> </span><span style="color: #800080;">4</span><span style="color: #000000;">) { fprintf( stderr , </span><span style="color: #800000;">"</span><span style="color: #800000;">P4 Transverse Add: Arguments Error!\n</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">; } client.SetPort(argv[</span><span style="color: #800080;">1</span><span style="color: #000000;">]); client.SetClient(argv[</span><span style="color: #800080;">2</span><span style="color: #000000;">]); client.SetTrans(CharSetApi::UTF_8 , CharSetApi::UTF_8 , CharSetApi::UTF_8, CharSetApi::UTF_8); TransverseDirectory(argv[</span><span style="color: #800080;">3</span><span style="color: #000000;">],MyList); </span><span style="color: #000000;">//</span><span style="color: #000000;"> Connect to server client.Init( &e ); </span><span style="color: #0000FF;">if</span><span style="color: #000000;">( e.Test() ) { e.Fmt( &msg ); fprintf( stderr, </span><span style="color: #800000;">"</span><span style="color: #800000;">%s\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, msg.Text() ); </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">; } list</span><span style="color: #000000;"><</span><span style="color: #000000;">FILELIST</span><span style="color: #000000;">></span><span style="color: #000000;">::iterator it; </span><span style="color: #0000FF;">for</span><span style="color: #000000;">(it </span><span style="color: #000000;">=</span><span style="color: #000000;"> MyList.begin(); it !</span><span style="color: #000000;">=</span><span style="color: #000000;"> MyList.</span><span style="color: #0000FF;">end</span><span style="color: #000000;">(); it</span><span style="color: #000000;">++</span><span style="color: #000000;">) { vector</span><span style="color: #000000;"><</span><span style="color: #000000;">string</span><span style="color: #000000;">></span><span style="color: #000000;">::iterator its; </span><span style="color: #0000FF;">for</span><span style="color: #000000;">(its </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #000000;">*</span><span style="color: #000000;">it).theList.begin(); its !</span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #000000;">*</span><span style="color: #000000;">it).theList.</span><span style="color: #0000FF;">end</span><span style="color: #000000;">(); its</span><span style="color: #000000;">++</span><span style="color: #000000;">) { path </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #000000;">*</span><span style="color: #000000;">it).path </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">\\</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> (</span><span style="color: #000000;">*</span><span style="color: #000000;">its); char</span><span style="color: #000000;">*</span><span style="color: #000000;"> pText </span><span style="color: #000000;">=</span><span style="color: #000000;"> ANSIToUTF8(path.c_str()); client.SetArgv( </span><span style="color: #800080;">1</span><span style="color: #000000;"> , &pText); client.Run( </span><span style="color: #800000;">"</span><span style="color: #800000;">add</span><span style="color: #800000;">"</span><span style="color: #000000;"> , &ui ); } } </span><span style="color: #000000;">//</span><span style="color: #000000;"> Close connection client.Final( &e ); </span><span style="color: #0000FF;">if</span><span style="color: #000000;">( e.Test() ) { e.Fmt( &msg ); fprintf( stderr, </span><span style="color: #800000;">"</span><span style="color: #800000;">%s\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, msg.Text() ); </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">; } </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; }</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>    此方法省M创徏p4q程的开销QQ务执行效率会提高不少Q而且也不会出现执行结果不E_的问题?nbsp;   </p> <p> </p> <p>附一QSDK下蝲地址</p> <p><a title="ftp://ftp.perforce.com/perforce/" href="ftp://ftp.perforce.com/perforce/">ftp://ftp.perforce.com/perforce/</a></p> <p>附二Q附上ANSI转UTF-8代码</p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:de1a1357-3f18-424a-bec7-b29768d70f5f" class="wlWriterEditableSmartContent"><pre style="background-color:#FFFFFF;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><span style="color: #000000;"> wchar_t</span><span style="color: #000000;">*</span><span style="color: #000000;"> ANSIToUnicode( const char</span><span style="color: #000000;">*</span><span style="color: #000000;"> str ) { int textlen ; wchar_t </span><span style="color: #000000;">*</span><span style="color: #000000;"> result; textlen </span><span style="color: #000000;">=</span><span style="color: #000000;"> MultiByteToWideChar( CP_ACP, </span><span style="color: #800080;">0</span><span style="color: #000000;">, str,</span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">, NULL,</span><span style="color: #800080;">0</span><span style="color: #000000;"> ); result </span><span style="color: #000000;">=</span><span style="color: #000000;"> (wchar_t </span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc((textlen</span><span style="color: #000000;">+</span><span style="color: #800080;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">sizeof(wchar_t)); memset(result,</span><span style="color: #800080;">0</span><span style="color: #000000;">,(textlen</span><span style="color: #000000;">+</span><span style="color: #800080;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, </span><span style="color: #800080;">0</span><span style="color: #000000;">,str,</span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">,(LPWSTR)result,textlen ); </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> result; } char</span><span style="color: #000000;">*</span><span style="color: #000000;"> UnicodeToANSI( const wchar_t </span><span style="color: #000000;">*</span><span style="color: #000000;">str ) { char </span><span style="color: #000000;">*</span><span style="color: #000000;"> result; int textlen; </span><span style="color: #000000;">//</span><span style="color: #000000;"> wide char to multi char textlen </span><span style="color: #000000;">=</span><span style="color: #000000;"> WideCharToMultiByte( CP_ACP, </span><span style="color: #800080;">0</span><span style="color: #000000;">, str, </span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">, NULL, </span><span style="color: #800080;">0</span><span style="color: #000000;">, NULL, NULL ); result </span><span style="color: #000000;">=</span><span style="color: #000000;">(char </span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc((textlen</span><span style="color: #000000;">+</span><span style="color: #800080;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">sizeof(char)); memset( result, </span><span style="color: #800080;">0</span><span style="color: #000000;">, sizeof(char) </span><span style="color: #000000;">*</span><span style="color: #000000;"> ( textlen </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> ) ); WideCharToMultiByte( CP_ACP, </span><span style="color: #800080;">0</span><span style="color: #000000;">, str, </span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">, result, textlen, NULL, NULL ); </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> result; } wchar_t</span><span style="color: #000000;">*</span><span style="color: #000000;"> UTF8ToUnicode( const char</span><span style="color: #000000;">*</span><span style="color: #000000;"> str ) { int textlen ; wchar_t </span><span style="color: #000000;">*</span><span style="color: #000000;"> result; textlen </span><span style="color: #000000;">=</span><span style="color: #000000;"> MultiByteToWideChar( CP_UTF8, </span><span style="color: #800080;">0</span><span style="color: #000000;">, str,</span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">, NULL,</span><span style="color: #800080;">0</span><span style="color: #000000;"> ); result </span><span style="color: #000000;">=</span><span style="color: #000000;"> (wchar_t </span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc((textlen</span><span style="color: #000000;">+</span><span style="color: #800080;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">sizeof(wchar_t)); memset(result,</span><span style="color: #800080;">0</span><span style="color: #000000;">,(textlen</span><span style="color: #000000;">+</span><span style="color: #800080;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, </span><span style="color: #800080;">0</span><span style="color: #000000;">,str,</span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">,(LPWSTR)result,textlen ); </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> result; } char</span><span style="color: #000000;">*</span><span style="color: #000000;"> UnicodeToUTF8( const wchar_t </span><span style="color: #000000;">*</span><span style="color: #000000;">str ) { char </span><span style="color: #000000;">*</span><span style="color: #000000;"> result; int textlen; </span><span style="color: #000000;">//</span><span style="color: #000000;"> wide char to multi char textlen </span><span style="color: #000000;">=</span><span style="color: #000000;"> WideCharToMultiByte( CP_UTF8, </span><span style="color: #800080;">0</span><span style="color: #000000;">, str, </span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">, NULL, </span><span style="color: #800080;">0</span><span style="color: #000000;">, NULL, NULL ); result </span><span style="color: #000000;">=</span><span style="color: #000000;">(char </span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc((textlen</span><span style="color: #000000;">+</span><span style="color: #800080;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">*</span><span style="color: #000000;">sizeof(char)); memset(result, </span><span style="color: #800080;">0</span><span style="color: #000000;">, sizeof(char) </span><span style="color: #000000;">*</span><span style="color: #000000;"> ( textlen </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">1</span><span style="color: #000000;"> ) ); WideCharToMultiByte( CP_UTF8, </span><span style="color: #800080;">0</span><span style="color: #000000;">, str, </span><span style="color: #000000;">-</span><span style="color: #800080;">1</span><span style="color: #000000;">, result, textlen, NULL, NULL ); </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> result; } char</span><span style="color: #000000;">*</span><span style="color: #000000;"> ANSIToUTF8(const char</span><span style="color: #000000;">*</span><span style="color: #000000;"> str) { wchar_t</span><span style="color: #000000;">*</span><span style="color: #000000;"> pUnicodeBuff </span><span style="color: #000000;">=</span><span style="color: #000000;"> ANSIToUnicode(str); char</span><span style="color: #000000;">*</span><span style="color: #000000;"> pUtf8Buff </span><span style="color: #000000;">=</span><span style="color: #000000;"> UnicodeToUTF8(pUnicodeBuff); free(pUnicodeBuff); </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> pUtf8Buff; }</span></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div><img src ="http://www.shnenglu.com/heath/aggbug/133692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/heath/" target="_blank">Heath</a> 2010-11-15 17:58 <a href="http://www.shnenglu.com/heath/archive/2010/11/15/133692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CruiseControl.NET for CI in Game developmenthttp://www.shnenglu.com/heath/archive/2010/08/09/122834.htmlHeathHeathMon, 09 Aug 2010 12:22:00 GMThttp://www.shnenglu.com/heath/archive/2010/08/09/122834.htmlhttp://www.shnenglu.com/heath/comments/122834.htmlhttp://www.shnenglu.com/heath/archive/2010/08/09/122834.html#Feedback0http://www.shnenglu.com/heath/comments/commentRss/122834.htmlhttp://www.shnenglu.com/heath/services/trackbacks/122834.html    有个目使用了CruiseControl.NETQ以下简UCC.NETQ作为持l集成工P周末抽空研究了一下,发现q款?b>ThoughtWorks贡献的开源工具功能非常强大,主要体现在下面三个方面:

1Q灵zR高可配|性,如:多重l合条g触发、多d队列{略Q?

2Q兼容目前几乎所有的行SCM工具Q得多U异构系l能够由CruiseControl.NETl一监控和管理;

3Q完善的使用文档Q上手和维护变得容易;

    而该目引以自豪的代码check in触发构徏的功能通过CC.NET也很Ҏ实现。之前用过HudsonQ该pȝ采用M式架构,使用者通过|页让Master控制Slave动作Q由于Master由别的部门管理,出问题后需要联pȝ关h解决Q会有一定的处理延迟Q而且安装在构建机上的Slave服务l常崩溃。而CC.NET直接安装在构建机上,配置IIS后可通过|页直接讉KQ操作维护都较前者容易。由于之前的构徏脚本是用VisualBuild实现的,所以不可能再花旉用CC.NET再写一遍。而通过实验得知Q其实CC.NET能够以ExecutableTask的Ş式很好地与VisualBuild集成Q目前每时定时构徏、NightBuild和构建成功后触发的自动测试都已经攑ֈ了CC.NET上了?

    ccnet.config Example:

<cruisecontrol xmlns:cb="urn:ccnet.config.builder">
  <queue name="Q1" duplicates="ApplyForceBuildsReAdd" />
  <queue name="Q2" duplicates="ApplyForceBuildsReAdd" />
  <project name="AgileBuild" queue="Q1" queuePriority="1">
    <category>AutoBuild</category>
    <triggers>
      <filterTrigger startTime="18:00" endTime="10:00">
        <trigger type="intervalTrigger" name="Continuous" seconds="1800" buildCondition="ForceBuild" />
        <weekDays>
          <weekDay>Monday</weekDay>
          <weekDay>Tuesday</weekDay>
          <weekDay>Wednesday</weekDay>
          <weekDay>Thursday</weekDay>
          <weekDay>Friday</weekDay>
        </weekDays>
      </filterTrigger>
    </triggers>
    <tasks>
      <exec>
        <executable>VisBuildCmd.exe</executable>
        <buildArgs>E:\GAMEDev\AgileBuilder.bld</buildArgs>
        <baseDirectory>D:\VisBuildPro7</baseDirectory>
        <buildTimeoutSeconds>3000</buildTimeoutSeconds>
      </exec>
    </tasks>
  </project>
  <project name="NightBuild" queue="Q2" queuePriority="1">
    <category>AutoBuild</category>
    <triggers>
      <scheduleTrigger time="23:00" buildCondition="ForceBuild" name="Scheduled">
        <weekDays>
          <weekDay>Monday</weekDay>
          <weekDay>Tuesday</weekDay>
          <weekDay>Wednesday</weekDay>
          <weekDay>Thursday</weekDay>
          <weekDay>Friday</weekDay>
        </weekDays>
      </scheduleTrigger>      
    </triggers>  
    <tasks>
      <exec>
        <executable>VisBuildCmd.exe</executable>
        <buildArgs>"BUILD_OPTION=clientworldeffect" "PACK_TYPE=RAR" E:\GAMEDev\NightBuilder.bld</buildArgs>
        <baseDirectory>D:\VisBuildPro7</baseDirectory>
        <buildTimeoutSeconds>0</buildTimeoutSeconds>
      </exec>
    </tasks>
  </project>
  <project name="NightAutoTest" queue="Q2" queuePriority="2">
    <category>AutoTest</category>
    <triggers>
      <projectTrigger serverUri="tcp://heath-builder:21234/CruiseManager.rem" project="NightBuild">
        <triggerStatus>Success</triggerStatus>
        <innerTrigger type="intervalTrigger" seconds="60" buildCondition="ForceBuild" />
      </projectTrigger>
    </triggers>
    <tasks>
      <exec>
        <executable>VisBuildCmd.exe</executable>
        <buildArgs>E:\GAMEDev\AutoTest.bld</buildArgs>
        <baseDirectory>D:\VisBuildPro7</baseDirectory>
        <buildTimeoutSeconds>0</buildTimeoutSeconds>
      </exec>
    </tasks>
  </project>  
</cruisecontrol>

References

[1] http://cruisecontrol.sourceforge.net/

[2] http://www.kinook.com/VisBuildPro/



Heath 2010-08-09 20:22 发表评论
]]>
写着?2)&mdash;&mdash;WoW角色资源dhttp://www.shnenglu.com/heath/archive/2010/04/24/113423.htmlHeathHeathSat, 24 Apr 2010 04:31:00 GMThttp://www.shnenglu.com/heath/archive/2010/04/24/113423.htmlhttp://www.shnenglu.com/heath/comments/113423.htmlhttp://www.shnenglu.com/heath/archive/2010/04/24/113423.html#Feedback2http://www.shnenglu.com/heath/comments/commentRss/113423.htmlhttp://www.shnenglu.com/heath/services/trackbacks/113423.html阅读全文

Heath 2010-04-24 12:31 发表评论
]]>
Slerp or Lerphttp://www.shnenglu.com/heath/archive/2010/03/14/109689.htmlHeathHeathSun, 14 Mar 2010 09:54:00 GMThttp://www.shnenglu.com/heath/archive/2010/03/14/109689.htmlhttp://www.shnenglu.com/heath/comments/109689.htmlhttp://www.shnenglu.com/heath/archive/2010/03/14/109689.html#Feedback1http://www.shnenglu.com/heath/comments/commentRss/109689.htmlhttp://www.shnenglu.com/heath/services/trackbacks/109689.htmlUnderstanding Slerp, Then Not Using It对Slerp的v源及性能做了详细的讨论。Slerpq不局限于l数Q因而不要认为只对Quaternion有效。作者认为Slerp会带来效率问题,即便l过优化也ƈ不能辑ֈ理想的速度(与lerp做比较而言)Q而且优化往往会降低代码的易读性。文章给Z一个结论:如果插DE中的常量速度不是必须的,那么最好用线性的lerp?/p>

Jason Gregory在他的引擎架构设计一书中也用“To SLERP or Not to SLERP (That’s Still the Question)”一节介绍了开发者对Slerp的争论,q介l他在Naughty Dog的同事针对PS3的优化方法,使Slerp可达?0周期/兌Q相比Lerp?6.25周期/兌已经很不错了?/p>

之前实没对Slerp的效率问题作q多的考虑Q引擎的Slerp直接使用的是D3DXQuaternionSlerpQMS应该对其做了优化Q效率怎么栯一下才知道了?/p>

Heath 2010-03-14 17:54 发表评论
]]>
Script in Gamehttp://www.shnenglu.com/heath/archive/2010/01/29/106753.htmlHeathHeathFri, 29 Jan 2010 11:34:00 GMThttp://www.shnenglu.com/heath/archive/2010/01/29/106753.htmlhttp://www.shnenglu.com/heath/comments/106753.htmlhttp://www.shnenglu.com/heath/archive/2010/01/29/106753.html#Feedback0http://www.shnenglu.com/heath/comments/commentRss/106753.htmlhttp://www.shnenglu.com/heath/services/trackbacks/106753.html阅读全文

Heath 2010-01-29 19:34 发表评论
]]>
FMOD Event System&mdash;&mdash;事g树策略、加载、内存分?/title><link>http://www.shnenglu.com/heath/archive/2010/01/18/105976.html</link><dc:creator>Heath</dc:creator><author>Heath</author><pubDate>Mon, 18 Jan 2010 15:40:00 GMT</pubDate><guid>http://www.shnenglu.com/heath/archive/2010/01/18/105976.html</guid><wfw:comment>http://www.shnenglu.com/heath/comments/105976.html</wfw:comment><comments>http://www.shnenglu.com/heath/archive/2010/01/18/105976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/heath/comments/commentRss/105976.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/heath/services/trackbacks/105976.html</trackback:ping><description><![CDATA[     摘要:   <a href='http://www.shnenglu.com/heath/archive/2010/01/18/105976.html'>阅读全文</a><img src ="http://www.shnenglu.com/heath/aggbug/105976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/heath/" target="_blank">Heath</a> 2010-01-18 23:40 <a href="http://www.shnenglu.com/heath/archive/2010/01/18/105976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何利用VS的Output快速定位UnitTest Failed代码http://www.shnenglu.com/heath/archive/2009/06/30/88889.htmlHeathHeathTue, 30 Jun 2009 06:08:00 GMThttp://www.shnenglu.com/heath/archive/2009/06/30/88889.htmlhttp://www.shnenglu.com/heath/comments/88889.htmlhttp://www.shnenglu.com/heath/archive/2009/06/30/88889.html#Feedback0http://www.shnenglu.com/heath/comments/commentRss/88889.htmlhttp://www.shnenglu.com/heath/services/trackbacks/88889.html很简单,在Project的Property Page讄Build Events中的Post-Build EventQ最z的写法是Command Line讄为:$(TargetPath)。由于UnitTest++的输出格式遵照了VS的格式,所以双击错误提C便可跌{到测试失败的代码行?/p>

Heath 2009-06-30 14:08 发表评论
]]>
战斗数值模拟器http://www.shnenglu.com/heath/archive/2009/06/24/88451.htmlHeathHeathWed, 24 Jun 2009 12:25:00 GMThttp://www.shnenglu.com/heath/archive/2009/06/24/88451.htmlhttp://www.shnenglu.com/heath/comments/88451.htmlhttp://www.shnenglu.com/heath/archive/2009/06/24/88451.html#Feedback0http://www.shnenglu.com/heath/comments/commentRss/88451.htmlhttp://www.shnenglu.com/heath/services/trackbacks/88451.html
   玩家属性和怪物属性根据EXCEL自动产生Q可动态修Ҏ倹{其核心是逻辑脚本的设计,逻辑脚本建立在Lua之上Q支持Lua所有的语法Ҏ和函数库,变量支持直接使用属性名字(呵呵Q有点吹了哈Q其实就是玩文字替换游戏Q加入了自己的一些语法)。第一版只支持单一PKQ这当然不能模拟真实场景下的战斗情况Q只是个基础Q后l功能l开发。。?br>    实现脚本语法着色的时候,在CodeGuru上找C一位同学写的SyntaxColorizeQ经q改造之后成功支持LuaQ然׃中文的存在且没有使用UnicodeQ导致Release版下Paste和Load出现着色异常,以前对_T("XXX")和TCHAR不以为然Q现在恐怕要重视h啦?nbsp;
    做Timer的时候,H然惛_一U不用if-else的更单实玎ͼ
void CCombatTimer::Forward()
{
    m_uMSec 
+= m_uStep;
    m_uSec  
+= m_uMSec / 1000;
    m_uMSec  
= m_uMSec % 1000;
    m_uMin  
+= m_uSec / 60;
    m_uSec   
= m_uSec % 60;
    m_uHour 
+= m_uMin / 60;
    m_uMin   
= m_uMin % 60;
    m_uHour  
= m_uHour % 24;
}



Heath 2009-06-24 20:25 发表评论
]]>
写在入职一q?/title><link>http://www.shnenglu.com/heath/archive/2009/06/24/88434.html</link><dc:creator>Heath</dc:creator><author>Heath</author><pubDate>Wed, 24 Jun 2009 08:24:00 GMT</pubDate><guid>http://www.shnenglu.com/heath/archive/2009/06/24/88434.html</guid><wfw:comment>http://www.shnenglu.com/heath/comments/88434.html</wfw:comment><comments>http://www.shnenglu.com/heath/archive/2009/06/24/88434.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.shnenglu.com/heath/comments/commentRss/88434.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/heath/services/trackbacks/88434.html</trackback:ping><description><![CDATA[     摘要: 入职一q_有些感慨Q成文?nbsp; <a href='http://www.shnenglu.com/heath/archive/2009/06/24/88434.html'>阅读全文</a><img src ="http://www.shnenglu.com/heath/aggbug/88434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/heath/" target="_blank">Heath</a> 2009-06-24 16:24 <a href="http://www.shnenglu.com/heath/archive/2009/06/24/88434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.bhxs.net.cn" target="_blank">ij뾫Ʒþþò </a>| <a href="http://www.5299.net.cn" target="_blank">2021þþƷ99Ʒ</a>| <a href="http://www.lanqie.com.cn" target="_blank">㽶þһ޶ӰԺ</a>| <a href="http://www.wangyanl3.com.cn" target="_blank">ƷŮٸAVѾþ</a>| <a href="http://www.fc117.cn" target="_blank">þ޾Ʒ벥</a>| <a href="http://www.1u11.cn" target="_blank">þþþþùƷ</a>| <a href="http://www.qdjzx.cn" target="_blank">ƷѾþþþӰԺ</a>| <a href="http://www.sfttc.cn" target="_blank">aaaƷþþùƬ</a>| <a href="http://www.90734.com.cn" target="_blank">þۺϸϾþù</a>| <a href="http://www.yixue114.cn" target="_blank">ɫۺϾþ</a>| <a href="http://www.pouhai.cn" target="_blank">Ʒ99þþþþ鶹</a>| <a href="http://www.vtql.cn" target="_blank">ĻþþƷAPP </a>| <a href="http://www.arm7.cn" target="_blank">þþþùһ</a>| <a href="http://www.haosenmy.cn" target="_blank">þþþƷ</a>| <a href="http://www.shiyoulhg.cn" target="_blank">þþĻ</a>| <a href="http://www.beauty-queen.cn" target="_blank">ѾƷպȾþ</a>| <a href="http://www.pouhai.cn" target="_blank">ŷ޹Ʒþ</a>| <a href="http://www.ylog.cn" target="_blank">þԭƷ</a>| <a href="http://www.dashi1.cn" target="_blank">þþƷվ</a>| <a href="http://www.eboa.com.cn" target="_blank">þþƷĻһ</a>| <a href="http://www.cnmango.cn" target="_blank">þþоƷ</a>| <a href="http://www.6105555.cn" target="_blank">97þù޾Ʒ</a>| <a href="http://www.sanling-group.com.cn" target="_blank">þСƵ</a>| <a href="http://www.fd-tex.cn" target="_blank">ŷ޹׾þþþþþ</a>| <a href="http://www.shidaqizhong.cn" target="_blank">ݺɫþþۺ</a>| <a href="http://www.hanchaoshi.cn" target="_blank">þþƷ99Ʒ</a>| <a href="http://www.abctoy.com.cn" target="_blank">ھƷۺϾþþ40p</a>| <a href="http://www.rh-hr.cn" target="_blank">þۺϾɫۺϾƷ</a>| <a href="http://www.lvzhuba.cn" target="_blank">޾ƷŮþþþ99С˵</a>| <a href="http://www.cc5ujj.cn" target="_blank">պһþ</a>| <a href="http://www.hiinterface.cn" target="_blank">69Ʒþþþվ </a>| <a href="http://www.xfb55.cn" target="_blank">91Ʒþþþþ</a>| <a href="http://www.y447.cn" target="_blank">þþþþþþƷɫ</a>| <a href="http://www.s9990.cn" target="_blank">ƷþþþùA</a>| <a href="http://www.tjjykj.com.cn" target="_blank">þþþƷ</a>| <a href="http://www.9ii8.cn" target="_blank">˾ƷۺϾþþ</a>| <a href="http://www.longfee.cn" target="_blank">99þۺϺݺۺϾþ</a>| <a href="http://www.py63.cn" target="_blank">޾ƷƬþ</a>| <a href="http://www.ciidc.org.cn" target="_blank">Ʒþþþþ˳</a>| <a href="http://www.qp8978.cn" target="_blank">þۺϾƷþ</a>| <a href="http://www.mydata.org.cn" target="_blank">ݾƷŮ˾þþþþ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>