锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 涓嶇浣跨敤閭g鏂瑰紡錛岄兘闇瑕佸皢紱繪暎鐐硅繘琛屾彃鍊鹼紙interpolation錛変互渚垮緱鍒板鉤婊戣礬寰勩傝繖閲屽氨鐗墊秹鍒頒綅緗彃鍊煎拰鏈濆悜鎻掑箋? 浠庢彃鍊煎嚱鏁頒笂鍙垎涓轟笁綾伙細1錛夌嚎鎬э紱2錛夊欏瑰紡錛?錛夋牱鏉°傞【鍚嶆濅箟錛岀嚎鎬ф彃鍊奸噰鐢ㄧ嚎鎬у嚱鏁幫紝澶氶」寮忔彃鍊奸噰鐢ㄥ欏瑰紡錛岃屾牱鏉℃彃鍊煎垯閲囩敤浜嗕竴緇勫欏瑰紡緇勬垚鐨勫垎孌靛嚱鏁般傜敱浜庢憚鍍忔満鐨勫叧閿礬寰勭偣閫氬父閮戒細澶т簬2涓紝鎵浠ユ彃鍊兼柟娉曚笂灝卞繀欏婚夊彇鏍鋒潯鏂規硶銆? 涓銆佷綅緗彃鍊?/strong> 1.1 鏍鋒潯綾誨瀷閫夋嫨 鍦ㄨ繖閲屾垜浠粎鑰冭檻涓夋鏍鋒潯鎻掑鹼紝鍥犱負瀹冧滑鍙揪鍒癈2榪炵畫銆備笁嬈℃牱鏉′腑涓昏浠ezier銆丆atmull-Rom銆佸潎鍖B鏍鋒潯涓鴻冩煡瀵硅薄錛屽畠浠兘鍏鋒湁璁$畻寮閿灝忕殑浼樼偣銆傚彲浠ラ氳繃涓嬮潰鍏紡鏉ュ畾涔夊畠浠細 綆鍖栦負錛? 涓嬮潰琛ㄦ牸鍒楀嚭浜嗕笁縐嶆彃鍊兼洸綰垮搴旂殑G鍜孧錛? 濡備笅鍥炬墍紺猴紝瀵?涓偣榪涜Bezier鎻掑煎緱鍒扮殑鏇茬嚎鍙細鏈変袱涓偣琚洸綰跨┛榪囷紝鑰孊-Spline鎻掑煎緱鍒扮殑鏇茬嚎涓嶄細緇忚繃鎺у埗鐐癸紝鍙湁Catmull-Rom Spline鍙互寰楀埌絀胯繃闄よ搗鐐瑰拰緇堢偣涔嬮棿鐨勬墍鏈夋帶鍒剁偣銆傛鍥犱負Catmull-Rom鍏鋒湁榪欎釜鐗規э紝浣垮緱瀹冭騫挎硾鍦板簲鐢ㄥ湪鍏抽敭甯у鉤婊戞彃鍊間笂錛屽洜姝ゆ垜浠夋嫨浜咰atmull-Rom鏍鋒潯浣滀負鎽勫儚鏈轟綅緗偣鐨勬彃鍊肩畻娉曘? 1.2 瀹炵幇 鍙傝冿細 [1] Mathematics for 3D Game Programming and Computer Graphics 3e by Eric Lengyel [2] http://en.wikipedia.org/wiki/Catmull-Rom_spline#Catmull.E2.80.93Rom_spline [3] http://www.codeproject.com/Articles/30838/Overhauser-Catmull-Rom-Splines-for-Camera-Animatio 浜屻佹湞鍚戯紙鏃嬭漿錛夋彃鍊?/strong> 2.1 Euler Angles VS Quaternion 涓夌淮絀洪棿涓弿榪版棆杞殑涓昏鏂規硶鏈塃uler Angles鍜孮uaternion銆侲uler Angles鏈変笁涓槑鏄劇殑闂錛?錛変笁杞翠笂鐨勬棆杞『搴忔晱鎰燂紱2錛塆imbal Lock鐜拌薄瀵艱嚧鏃嬭漿鑷敱搴︿涪澶憋紱3錛夌嫭绔嬪湴瀵逛笁涓棆杞垎閲忚繘琛屾彃鍊鹼紝蹇界暐浜嗕笁杞翠箣闂寸殑渚濊禆鍏崇郴錛屽鑷存彃鍊肩粨鏋滀笉鐞嗘兂銆備笌Euler Angles涓嶅悓鐨勬槸錛孮uaternion娌℃湁灝嗘棆杞垎瑙e埌涓変釜杞村悜涓婏紝鑰屾槸鐢ㄤ竴涓棆杞醬鍜岀粫璇ヨ醬鐨勬棆杞搴︽潵鎻忚堪錛屾墍浠ヤ粠鏍規湰涓婃秷闄や簡Euler Angles鐨勪笁澶ч棶棰樸傛湁鍏砆uaternion鐨勮緇嗘弿榪板彲鍙傝僛1]錛屽湪姝や笉鍐嶇瘡榪般? 2.2 LERP VS SLERP 鍥涘厓鏁扮嚎鎬ф彃鍊鹼紙Linear Quaternion interpolation錛夌殑璁$畻鍏紡涓猴細 鍥涘厓鏁扮悆闈㈢嚎鎬ф彃鍊鹼紙Spherical Linear Quaternion interpolation錛夌殑璁$畻鍏紡涓猴細 鍏朵腑錛屛鎬負涓や釜鍥涘厓鏁扮殑澶硅銆? 涓轟簡鏂逛究灞曠ず錛屾垜浠冭檻鍦?D鎯呭喌瀵硅搴榪涜涓ゆ鎻掑鹼紝涓ょ綆楁硶鍦ㄦ彃鍊兼晥鏋滀笂瀛樺湪鐨勫樊寮傦紝濡備笅鍥撅紙b涓篖ERP銆乧涓篠LERP錛夛細 浠庡浘涓彲浠ョ湅鍑篖ERP鍏跺疄鏄涓ゅ洓鍏冩暟鍦ㄥ渾涓婄殑寮﹁繘琛屼簡絳夊垎錛岃孲LERP鍒欐槸瀵瑰渾寮ц繘琛岀瓑鍒嗐傜敱姝ゅ緱鍑虹殑緇撹鏄紝SLERP寰楀埌浜嗘瘮LERP鏇村鉤婊戠殑鎻掑肩粨鏋溿? 涓轟簡淇濊瘉鎻掑兼洸綰跨殑C2榪炵畫鎬э紝闇瑕佷嬌鐢ㄧ悆闈㈠洓杈瑰艦鎻掑鹼紙Spherical Quadrangle interpolation錛夋柟娉曘備緥濡傦紝瀵筿1鍜宷2鎻掑鹼紝棣栧厛瑕佺敤q0銆乹1銆乹2銆乹3璁$畻鍑轟袱涓帶鍒剁偣錛圛nner Quadrangle Point錛夛紝鍏紡濡備笅錛? 鐒跺悗閫氳繃涓嬪紡寰楀埌鏈緇堟彃鍊肩粨鏋滐細 2.3 瀹炵幇 涓婇潰浠g爜娌℃湁鑰冭檻涓や釜鍥涘厓鏁頒箣闂村す瑙掑ぇ浜?80擄鐨勬儏鍐點備緥濡傦紝鑰冭檻q1->q2鐨勬彃鍊艱搴ξ?gt;180擄錛屾垜浠彲浠ヨq1->q2鍙嶅悜鏃嬭漿2蟺-胃錛屽嵆鏃嬭漿-(2蟺-胃)錛屾牴鎹洓鍏冩暟鐨勫畾涔塠v*sin(胃/2) , cos(胃/2)]錛岄偅涔堝q2榪涜澶勭悊鍙樹負[-v*sin(胃/2) , -cos(胃/2)]銆傝繖涓鐞嗗彲浠ユ斁鍦ˋddSplinePoint涓潵鍋氾細 鍙傝冿細 [1] Quaternions, Interpolation and Animation by EB Dam - 1998 鍐呭瓨娉勬紡媯嫻嬬殑鍩烘湰姝ラ鏄細1錛夊寘瑁咃紙閲嶈澆錛夊唴瀛樺垎閰?閲婃斁API錛?錛夎繘琛屽唴瀛樺垎閰嶆椂璁頒笅鐩稿叧淇℃伅錛氬湴鍧銆佸ぇ灝忋佽皟鐢ㄦ爤錛?錛夐噴鏀炬椂娓呴櫎涔嬪墠璁板綍鐨勫搴斾俊鎭紱4錛夌▼搴忛鍑烘椂錛堢‘淇濆湪鎵鏈夊唴瀛橀噴鏀炬搷浣滃畬鎴愪箣鍚庯級錛岃緭鍑哄墿涓嬬殑璁板綍銆傚叾涓紝瀵硅繘琛屽垎閰嶆搷浣滄槸鐨勮皟鐢ㄦ爤鍥炴函鏄釜閲嶇偣淇℃伅錛屽畠鑳藉甯姪鎴戜滑鎵懼嚭鍐呭瓨娉勬紡浠g爜銆? Windows涓殑Dbghelp搴撴彁渚涗簡涓板瘜鐨勮皟璇旳PI銆係tackWalk搴旇鏄繘琛屾爤鍥炴函鏈鐩存帴鐨勪竴縐嶆帴鍙d簡錛屼絾鏄畠涓嶅蹇傚鏋滆兘鍏堣褰曚笅璋冪敤鏍堜笂鐨凜ALL鎸囦護鍦板潃錛岀劧鍚庡湪杈撳嚭鏃ュ織鏃惰В鏋愬嚭絎﹀彿錛屽皢浼氬ぇ澶ч檷浣庢嫻嬫満鍒跺紼嬪簭鏈韓鎬ц兘鐨勫獎鍝嶃侱bghelp搴撲腑鎻愪緵浜哠ym*FromAddr緋誨垪API錛屽彲浠ラ氳繃鎸囦護鍦板潃鑾峰彇鍑芥暟絎﹀彿錛岄偅涔堝墿涓嬬殑灝辨槸濡備綍璁板綍鎸囦護鍦板潃鐨勯棶棰樹簡銆備粠緗戜笂鍊熶簡涓寮爔86璋冪敤鏍堢ず鎰忓浘錛屽涓嬶細 浠庡浘涓彲浠ョ湅鍑猴紝Callee鐨凟BP濮嬬粓鎸囧悜Caller鐨凟BP錛孍BP涓嬮潰鏄寚鍚慍aller涓嬩竴鏉℃寚浠わ紙娉ㄦ剰x86浣撶郴涓嬫爤鐨勫闀挎柟鍚戞槸灝忓湴鍧錛夛紝鍥犳閫氳繃EBP灝卞彲浠ュ洖婧暣涓皟鐢ㄦ爤浜嗐傞氳繃涓嬮潰浠g爜鍙互瀹炵幇姝ゅ姛鑳斤細 瀹忓弬鏁癴rame鏄釜void*鎸囬拡鏁扮粍錛屾暟緇勭殑澶у皬鍙栧喅浜庢兂瑕佸洖婧殑鏍堟繁搴︺傚唴瀛樺垎閰嶅拰鍥炴敹鐨勫寘瑁呬唬鐮佸涓嬶細 鎴戜滑鐪嬪埌錛屽唴瀛樼鐞嗙郴緇熷唴閮ㄧ粓絀惰繕鏄浣跨敤璇█鎻愪緵鐨勫唴瀛樺垎閰?閲婃斁API錛屽彧瑕侀厤瀵瑰疄鐜頒簡鍒嗛厤涓庨噴鏀劇鐞嗭紝緋葷粺鍐呴儴鐨勬棤娉勬紡鏄緢瀹規槗淇濊瘉鐨勩傚湪榪欓噷鐫閲嶈瑙e師鐞嗭紝灝變笉閲嶈澆new/delete operator浜嗐傛渶鍚庣湅涓涓嬭皟鐢ㄦ爤鍑芥暟絎﹀彿鐨勫洖婧唬鐮侊細 鎴戜滑鐢ㄤ笅闈唬鐮佸仛嫻嬭瘯鐢ㄤ緥錛? 娉勬紡媯嫻嬬粨鏋滐細 鍙傝冿細 [1] Using DbgHelp 鎴戞兂浜嗕袱縐嶆柟妗堬紝鏈鍒濈殑鏂規鐏墊劅鏉ヨ嚜鍏夌嚎鍙嶅皠錛屽涓嬪浘鎵紺恒? 鍥犱負闃繪尅鏍煎瓙鏄醬瀵歸綈鐨勶紝閫氳繃娉曞悜閲弉鍙互寰楀埌b鐐圭殑鍙嶅皠鍚戦噺e'-o錛屽皢|e'-o|闄愬畾鍦ㄤ竴涓浐瀹氬鹼紝姝ゆ椂濡傛灉e'涓嶅湪闃繪尅閲岄潰錛屽氨灝嗗畠浣滀負鏂扮殑緇堢偣銆傝鏂規鐨勫疄楠岀粨鏋滀笉澶護浜烘弧鎰忥紝褰撹鑹茬闃繪尅杈冭繎鏃舵柇緇劅澶槑鏄撅紝鍥犱負|e' - b|鐨勯暱搴﹁緝鐭傚彟澶栧畠涓嶈兘澶勭悊e'鍦ㄩ樆鎸¢噷鐨勬儏鍐碉紝琚崱浣忎笉鍔ㄧ殑姒傜巼渚濈劧杈冨ぇ銆? 絎簩縐嶆柟妗堟槸鏍規嵁縐誨姩瓚嬪悜鍦ㄤ竴涓醬鍚戞壘涓涓彲杈捐瘯鎺㈢偣錛岀劧鍚庣敤闄愬埗浜嗘悳绱㈢┖闂達紙鎼滅儲鑺傜偣鍦?0浠ュ唴錛夌殑A*綆楁硶鎵懼埌涓鏉″埌璇曟帰鐐圭殑璺緞錛屽涓嬪浘銆? 璁綿iff_x = 緇堢偣x - 璧風偣x錛宒iff_y = 緇堢偣y - 璧風偣y錛屽綋diff_x > diff_y錛岃瀹氫負瓚嬪悜x鏂瑰悜涓婄Щ鍔紝鍦ㄨ繖縐嶆儏鍐典笅鍦ㄧ粓鐐箉杞村悜涓娐?0涓牸瀛愬唴鍘繪壘鍒頒竴涓渶鎺ヨ繎緇堢偣鐨勬棤闃繪尅鐐癸紙縐板畠涓哄彲杈捐瘯鎺㈢偣錛夈傜敱浜庤瘯鎺㈢偣涓庣帺瀹跺綋鍓嶇偣鏋佹湁鍙兘鏄洿綰夸笉榪為氱殑錛岃屼笖瀹冧滑涓嶅彲鑳藉お榪滐紝鎵浠ヤ嬌鐢ㄤ簡涓涓皢鎼滅儲鑺傜偣涓暟闄愬埗鍦?0浠ュ唴A*鏉ュ緱鍒頒竴鏉¤礬寰勩傝鏂規澶ч儴鍒嗘儏鍐甸兘鑳藉湪杈圭紭鎵懼埌鍚堢悊鐐癸紝浣嗗鏋滅帺瀹跺瀭鐩撮潰鏈濋樆鎸″唴縐誨姩涓斾笉鑳藉湪闄愬埗鎼滅儲鑼冨洿鍐呮壘鍒板彲杈劇偣錛岃鑹插氨浼氬崱浣忎笉鍔紝榪欑鎯呭喌灝卞彧鑳借鐜╁鑷繁璋冩暣涓涓嬫湞鍚戜簡銆? 闇瑕佹敞鎰忕殑鏄紝濡傛灉鏄涓弬鏁幫紝Lua鐨勫帇鏍堥『搴忔槸object pointer銆佸弬鏁頒粠宸﹀埌鍙籌紝鎵浠ユ爤欏跺厓绱犳槸鍑芥暟絳懼悕鏈鍙寵竟鐨勫弬鏁般?/p> 鏍稿績鏁版嵁緇撴瀯鎴戦噰鐢ㄩ摼琛ㄦ暟緇勶紝灝嗙浉鍚岄鑹蹭笖閭繪帴鐨勬場娉′覆鎴愪竴涓摼琛ㄣ傞噰鐢ㄨ繖縐嶆暟鎹粨鏋勶紝鏄熀浜庝笅闈㈣冭檻錛?錛夐氳繃棰滆壊鍒掑垎緙╁皬鎼滅儲鍖哄煙錛?錛夋病鏈夋帓搴忥紝娌℃湁涓棿鎻掑叆鑺傜偣鐨勯渶姹傦紱3錛夎妭鐪佸唴瀛樸傚綋鐒訛紝娓告垙鐣岄潰涓殑娉℃場榪樻槸鎶婂畠瀵瑰簲鍒頒竴涓簩緇存暟緇勪腑錛屾瘡涓厓绱犲瓨鍌ㄤ竴涓場娉″璞$殑鎸囬拡錛岃瀵硅薄涓嚦灝戝寘鍚細棰滆壊銆佸潗鏍囷紝鍒嗗箋傚涓嬪浘鎵紺猴細 鍓╀笅闇瑕佽冭檻鐨勬槸鍙戝皠娉℃場棰滆壊濡備綍浜х敓錛熷鏋滀粠絀哄叧鍗″紑濮嬶紝鍓嶉潰鍙互鐢ㄩ殢鏈猴紝鍚庨潰灝辮浣跨敤緇熻淇℃伅浜嗐傚湪姣忎釜閾捐〃澶村彲浠ョ粺璁¤鍫嗘場娉″紑闂с佹暟閲忕瓑錛屽埄鐢ㄨ繖浜涗俊鎭彲浠ュ喅瀹氬彂灝勬場娉$殑棰滆壊銆? 1. 寤虹珛婧愪唬鐮佺儲寮?/font> WinDbg鎻愪緵浜嗕竴濂楃敤浜庣鐞唒db瀵瑰簲鐨勬簮浠g爜鐨勫伐鍏鳳紝浣嶄簬鍏跺畨瑁呯洰褰曠殑srcsrv涓嬶紝瀵筕SS銆丼VN銆丆VS銆丳erforce鎻愪緵浜嗘敮鎸侊紝鍒嗗埆瀵瑰簲vssindex.cmd銆乻vnindex.cmd銆乧vsindex.cmd銆乸4index.cmd榪欏洓涓猵erl鑴氭湰銆傚叾瀹烇紝ssindex.cmd鎵嶆槸鍏蜂綋瀹炵幇錛屽畠鏍規嵁浼犲叆鐨勭増鏈帶鍒剁郴緇熸爣璇嗭紝璋冪敤瀵瑰簲鐨刾erl module銆? svnindex.cmd閫氳繃/source鍜?symbols鍙傛暟鏉ユ寚瀹氭簮浠g爜鐩綍鍜孭DB鐩綍錛?debug鍙緭鍑哄鐞嗙殑璇︾粏淇℃伅錛?user鍜?pass鎻愪緵svn璐︽埛鍜屽瘑鐮併侾DB鏂囦歡涓湁涓鑺備笓闂ㄧ敤浜庡瓨鏀炬簮浠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" 鍦ㄦ墽琛屼笂闈㈠懡浠ゅ墠錛岀‘淇漃erl鍜孲ubversion宸茬粡琚畨瑁呬笖璁劇疆浜哖ATH鐜鍙橀噺銆傝鍛戒護灝嗘彁鍙杝ource code鐨勬湇鍔″櫒璺緞鍜屽綋鍓峈evision錛岀劧鍚庡啓鍏DB銆備笅闈㈡槸閫氳繃pdbstr鑾峰彇鐨勪俊鎭細 涓婇潰杈撳嚭鏄粡榪囨牸寮忓寲鐨勶紝鍘熷淇℃伅鍙互閫氳繃srctool -n鏌ョ湅錛? 鍙互鐪嬪嚭錛屽師濮嬩唬鐮佽礬寰勫悗闈㈣窡浜嗕竴鏉vn cat鎸囦護錛岀敱浜庢病鏈夋寚瀹歴ourcepath錛屾墍浠?targ%緙虹渷涓哄綋鍓嶈礬寰勶紙"C:\Program Files\Debugging Tools for Windows (x64)\srcsrv"錛夈?nbsp; 2. 鍒涘緩絎﹀彿鏈嶅姟鍣?/font> 鎵璋撶鍙鋒湇鍔″櫒錛屾渶綆鍗曠殑褰㈠紡灝辨槸鏂囦歡鍏變韓鏈嶅姟鍣ㄣ傛垜浠嬌鐢?a target="_blank">symstore鍛戒護錛屽皢1涓駭鐢熺殑pdb娣誨姞鍒頒竴涓枃浠跺叡浜湇鍔″櫒涓婏紝濡傦細 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鐨剆ignature鍜宎ge浜х敓涓涓狦UID錛屽茍灝哖DB鏀劇疆浜庝互鏀笹UID涓哄悕瀛楃殑鐩綍涓嬶細 褰揹ebug鏃訛紝灝哢NC璺緞娣誨姞鍒癬NT_SYMBOL_PATH涓紙濡傦細_NT_SYMBOL_PATH=CACHE*F:\Symbols;SRV*http://msdl.microsoft.com/download/symbols;SRV*\\server.com\pub\Symbols錛夛紝璋冭瘯鍣ㄤ細鑷姩鍒版寚瀹氱殑絎﹀彿鏈嶅姟鍣ㄤ笂鍘繪悳绱㈠搴旂殑pdb鏂囦歡銆? symstore澶уぇ綆鍖栦簡絎﹀彿鐨勭増鏈鐞嗛棶棰橈紝鍏充簬瀹冪殑璇︾粏浠嬬粛鍙弬鑰?a target="_blank">symstore浠嬬粛銆? 鍊煎緱娉ㄦ剰鐨勬槸錛宻ymstore娌℃湁閿佹満鍒訛紝騫朵笉鏀寔澶氫漢鍚屾椂鎿嶄綔銆傚疄闄呮儏鍐典腑錛屼篃鍙湁鑷姩鏋勫緩鏃舵墠浼氬仛姝ゆ搷浣溿? 3. 浣跨敤WinDbg鍒嗘瀽Dump鏂囦歡 鎴戜滑鍦ㄤ唬鐮佷腑鍔犲叆鍙戠敓寮傚父鍐橫iniDump鐨勫姛鑳斤紝鍦ㄧ▼搴忓穿婧冩椂浜х敓dump鏂囦歡銆傚湪浣跨敤WinDbg鍒嗘瀽dump鏂囦歡鏃訛紝闇瑕佽緗甋ymbol File Path鍜孲ource File Path錛屼篃鍙互鐩存帴璁劇疆鐜鍙橀噺_NT_SYMBOL_PATH鍜宊NT_SOURCE_PATH銆傚湪璁劇疆_NT_SOURCE_PATH鏃朵嬌鐢?SRV*CachePath"灝嗚〃紺哄惎鐢ㄤ唬鐮佹彁鍙栧姛鑳斤紝鎵цsvn cat鍐欏叆鍒癈achePath鎸囧畾鐨勭洰褰曪紝鍚﹀垯灝嗕嬌鐢ㄥ師濮嬭礬寰勩傛鍚庯紝閫氳繃鐐瑰嚮Call Stack涓殑鍑芥暟璋冪敤渚夸細瑙﹀彂浠巗vn璇誨彇瀵瑰簲浠g爜鐨勬搷浣滐紙閫氬父浼氭湁涓涓畨鍏ㄨ鍛婄獥鍙e脊鍑猴級銆? 瀵逛簬浣跨敤WinDbg榪涜璋冭瘯鍦ㄦ灝變笉澶氳浜嗭紝鎺ㄨ崘涓鏈笉閿欑殑涔︺夾dvanced 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 涓銆丄* Path-Finding A*綆楁硶灝變笉澶氳浜嗭紝鍙弬鑰冿細 浜屻侀澶勭悊 姣忎釜鐩擱偦鍖哄潡錛圕1鍜孋2錛夐兘鏈変竴鏉$敱鍏叡杈癸紝璇ヨ竟涓や晶灝忔牸緇勬垚L1鍜孡2錛屽垯榪為氱偣闆咵婊¤凍涓嬪垪鏉′歡錛? 瀵逛笂闈㈠緱鍒扮殑浣嶄簬鍚屼竴鍖哄潡鐨勭偣闆嗗悎浣跨敤local A*鍋氳繛閫氭ф祴璇曪紝涓嬪浘鐢ㄧ洿綰胯繛鎺ユ潵琛ㄧず涓ょ偣浜掗氾細 涓夈佸璺?/font> 浣跨敤鍖哄潡榪為氫俊鎭紝榪涜鍖哄潡綰*錛屽緱鍒板尯鍧椾箣闂寸殑榪炴帴鐐癸紝濡傛灉鍦ㄩ澶勭悊鏃朵繚瀛樹簡鍖哄潡鍐呬簰閫氱偣鐨勮礬寰勶紝灝變笉蹇呭啀榪涜鍖哄潡鍐呯殑local A*浜嗐? 瀹為獙緇撴灉琛ㄦ槑錛屽湪鏈噰鐢ㄥ尯鍧楀唴棰勫瓨璺緞鐨勬儏鍐典笅錛屼腑闀胯窛紱誨璺嬌鐢ㄥ眰嬈*鍚庣殑騫沖潎鏁堢巼鏄櫘閫欰*鐨?鍊嶄互涓婏紝璺濈瓚婇暱鏁堢巼瀵規瘮瓚婃槑鏄俱? A* 93ms HPA* 15ms 浠庝笂鍥句腑鍙互鐪嬪嚭錛孒PA*寰楀埌鐨勮礬寰勫茍涓嶆槸鏈浼樼殑錛屽畠鏄湪鏈浼樺拰鏁堢巼涓婄殑鎶樹腑錛岄傚悎浣滀負闀胯窛紱誨璺殑涓縐嶄紭鍖栨柟妗堛? 鍥涖佷紭鍖栫偣 涓涓敼榪涚殑鏂規硶鏄榪囬暱鐨勮竟鐣屽啀鍋氬垝鍒嗭細 鍙傝冿細 [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 鍓嶆鏃墮棿閬囧埌榪囪繖鏍風殑闂錛氬凡鐭ヤ竴2D鍦板浘鏍煎瓙鐨勯暱瀹斤紙w銆乭錛夊強姣忎釜鏍煎瓙鐨勮竟闀匡紙a錛屾牸瀛愪負姝f柟褰級錛岀粰瀹氱墿浣撶殑2D鍧愭爣錛坧os[x , y]錛夊強鍗婂緞錛坮錛夛紝姹傝В鐗╀綋鍦?D鍦板浘鏍煎瓙涓墍鍗犵殑鏍煎瓙錛屼粎鑰冭檻n*n鐨勬儏鍐點傚ぇ姒傜殑姹傝В榪囩▼濡備笅錛? 1錛夋牴鎹崐寰勶紝紜畾n*n涓殑n銆傚亣瀹氳綆楀叕寮忎負錛歯 = Round(2*r / a) 2錛夋牴鎹?D鍧愭爣寰楀埌鐗╀綋鐨勨滀腑蹇冩牸瀛愨濄傛牴鎹畁鐨勫鍋訛紝璁$畻鍏紡涓嶅悓錛屽涓嬪浘鎵紺恒? n涓哄伓鏁癧1] n涓哄鏁癧2] [1]錛歡rid(x , y) = Round(pos / a) [2]錛歡rid(x , y) = Floor(pos / a) 鍏朵腑錛屾牸瀛愬潗鏍噚 >= 0 , y >= 0銆? 3錛変互鈥滀腑蹇冩牸瀛愨濅負鍩虹錛屾眰鍑虹墿浣撳崰鎹殑鍏朵粬鏍煎瓙銆傝繖鏍風殑鎻忚堪錛岃浜哄鏄撴兂鍒伴掑綊錛屽氨鍍忕敤娣卞害浼樺厛鏂規硶閬嶅巻鏍戦偅鏍鳳紝浼唬鐮佺畻娉曞涓嬶細 铏界劧錛岃綆楁硶寰楀埌浜嗘紜殑姹傝В緇撴灉錛屼絾鏄敱浜庢瘡涓牸瀛愰兘浼氭爣璁板懆鍥寸殑8涓牸瀛愶紝鎵浠ュ瓨鍦ㄥぇ閲忕殑閲嶅錛屽啀鑰呭鏋滀笂闈㈢殑榪囩▼姣忓撫閮借繘琛岀殑璇濓紝鍑芥暟璋冪敤寮閿涔熸槸鐩稿綋鍙銆?/p>
寰幆鑷劧鏄笉鍙伩鍏嶇殑錛屾秷闄ら噸澶嶄究鎴愪簡浼樺寲鐨勭洰鏍囥傚垎鏋愭牸瀛愬浘鍜宯涓?鍜?鐨勬儏鍐碉紝璇曞浘鎵懼嚭鐢ㄥ驚鐜唬鏇塊掑綊鐨勬柟娉曪紝鎴戝彂鐜頒簡涓嬮潰涓涓湁瓚g殑瑙勫緥錛?/p>
浠庘滀腑蹇冩牸瀛愨濆嚭鍙戯紝欏烘椂閽堬紙鎴栭嗘椂閽堬級浠ヤ笂鍥炬柟寮忓彲浠ヨ蛋閬嶆墍姹傝В鐨勬瘡涓牸瀛愯屼笉閲嶅銆傚湪瀹炵幇涓婏紝姣忎釜杞涔熸槸鏈夎寰嬬殑錛屽彲浠ラ氳繃涓涓?*2鐨勮漿瑙掔煩闃墊潵鎺у埗錛?/p>
[1 , 0][0 , -1] [0 , 1][-1 , 0] 欏烘椂閽堟柟寮忕殑杞闃?/p>
鐭╅樀涓殑姣忎釜鍏冪礌浠h〃浠庡綋鍓嶆牸瀛愯蛋鍒頒笅涓牸瀛愬湪row鍜宑ol涓婄殑鍙樺寲銆傚姞涔嬶紝鍦ㄨ漿瑙掍箣闂寸殑璺暱錛堜互鏍煎瓙涓暟璁★級鏈夋瘡杞袱嬈¢掑鍗曚綅1鐨勮寰嬶紝綆楁硶灝變笉闅懼緱鍒頒簡錛屼笅闈㈠悓鏍蜂互浼唬鐮佺ず錛?/p>
鐢∕FC紼嬪簭楠岃瘉浜嗕竴涓嬬畻娉曠殑姝g‘鎬э紝鏍囧彿灞曠ず浜嗗驚鐜殑璺嚎錛堟敞鎰廏DI鐨勫潗鏍囩郴涓璝鐨勬鏂瑰悜鏈濅笅錛夛細 涓銆佺郴緇熻皟鐢?/p> 閫氳繃浣跨敤WinExec銆丼hellExecute鎴杝ystem錛屽錛?/p> 姝ゆ柟娉曠殑铏界劧綆鍗曪紝浣嗗瓨鍦ㄦ晥鐜囬棶棰橈紝鍥犱負鏈夊垱寤鴻繘紼嬬殑宸ㄥぇ寮閿銆傛澶栦笉鍚岀増鏈殑Perforce涔熶細鍑虹幇涓嶅悓鐨勬墽琛岀粨鏋滐紝閽堝鐗瑰畾鐨勪腑鏂囦細鍑虹幇鎿嶄綔澶辮觸鐨勮寮傞棶棰樸?/p>
浜屻丳erforce SDK Perforce鎻愪緵鏈塖DK鐢ㄤ互鎵╁睍鎴栭泦鎴愬埌鍏朵粬搴旂敤涓紝铏界劧娌℃湁璇︾粏鐨勬枃妗o紝浣嗗彲浠ラ氳繃瀛︿範SDK涓殑sample鏂囦歡鏉ュ涔狅紝姝ゆ柟娉曟渶紼沖畾銆?/p>
涓嬮潰浠g爜灞曠ず浜嗛氳繃SDK涓瑿lientAPI鏉ラ掑綊娣誨姞鎸囧畾鏂囦歡澶逛笅鐨勬墍鏈夋枃浠訛細 姝ゆ柟娉曠渷鍘諱簡鍒涘緩p4榪涚▼鐨勫紑閿錛屼換鍔℃墽琛屾晥鐜囦細鎻愰珮涓嶅皯錛岃屼笖涔熶笉浼氬嚭鐜版墽琛岀粨鏋滀笉紼沖畾鐨勯棶棰樸?nbsp; 闄勪竴錛歋DK涓嬭澆鍦板潃 ftp://ftp.perforce.com/perforce/ 闄勪簩錛氶檮涓夾NSI杞琔TF-8浠g爜
]]>
]]>
]]>
A*綆楁硶鐨勪紭鍖栧彲浠庢悳绱㈣妭鐐瑰偍瀛樺拰OpenList鎺掑簭涓ゆ柟闈㈠叆鎵嬨?
瀵瑰湪E涓笖鍚岃竟鐨勮繛緇牸瀛愬彇鍏朵腑鐐癸紝濡備笅鍥炬墍紺猴細
]]>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
);
鍏朵腑錛孌3DXQuaternionSquadSetup鐢ㄤ簬榪斿洖鍐呮彃鐨勬帶鍒剁偣銆傚畠浠叿浣撶殑瀹炵幇鍏紡鍜岀敤娉曪紝鏈夊叴瓚g殑鍚屽鍙互鍙傝僊SDN銆傚湪姝ら渶瑕佽鏄庣殑鏄紝
D3DXQuaternionSquad浣跨敤浜哠lerp浣滀負鍐呴儴瀹炵幇錛屼細瀵艱嚧鍦ㄤ袱涓す瑙掍負180擄宸﹀彸鐨凲uaternion涔嬮棿鎻掑間細鍑虹幇鏂鐨勯棶棰樸備笅闈唬鐮侀氳繃
瀹炵幇涓涓冭檻浜嗕笂榪版儏鍐電殑Slerp鐗堟湰錛屽湪q1鍜宷2澶硅鍦?擄鎴栬?80擄鏃訛紝浣跨敤綰挎у唴鎻掕岄潪鐞冮潰錛屾潵瑙e喅璇ラ棶棰樸?/pre>
]]>
]]>if n is even
{
get the index of 'center grid' (row , col)
ExtendHeldGrid(row , col , n)
ExtendHeldGrid(row - 1 , col , n)
ExtendHeldGrid(row - 1 , col - 1 , n)
ExtendHeldGrid(row , col - 1 , n)
}
else
{
get the index of 'center grid' (row , col)
ExtendHeldGrid(row , col , n)
}
function ExtendHeldGrid(row , col , level)
{
if(level <= 0)
return
if((row >= 0 and row < MaxGridWidth) and (col >= 0 and col < MaxGridHeight))
{
mark the grid(row , col)
ExtendHeldGrid(row , col , level - 2)
if(level - 2 > 0)
{
ExtendHeldGrid(row + 1 , col , level - 2)
ExtendHeldGrid(row - 1 , col , level - 2)
ExtendHeldGrid(row , col + 1 , level - 2)
ExtendHeldGrid(row , col - 1 , level - 2)
ExtendHeldGrid(row + 1 , col + 1 , level - 2)
ExtendHeldGrid(row - 1 , col + 1 , level - 2)
ExtendHeldGrid(row + 1 , col - 1 , level - 2)
ExtendHeldGrid(row - 1 , col - 1 , level - 2)
}
}
}
conerMat =
{
{0 , -1} ,
{-1 , 0} ,
{0 , 1} ,
{1 , 0}
}
dir = 0 /// 杞鎺у埗錛屽洓涓漿瑙掗『鏃墮拡0~3
span = 1 /// 杞闂寸殑璺ㄥ害
count = 1 /// 姣忎袱嬈″鍔犱竴涓法搴?
rin = 1 /// 涓嬩竴涓漿瑙掔殑寰幆绱㈠紩
if n is even
get the index of 'center grid' (row , col)
else
get the index of 'center grid' (row , col)
for(i = 0; i < n * n; ++i)
{
if((row >= 0 and row < MaxGridWidth) and (col >= 0 and col < MaxGridHeight))
mark the grid(row , col)
if(i == rin)
{
dir = (dir + 1) % 4
if(count == 2)
{
++span
count = 1
}
else
++count
rin = i + span
}
row = row + conerMat[dir][0]
col = col + conerMat[dir][1]
}
]]>_snprintf(cmdbuf , 1024 , "p4 -c %s add \"%s\"" , argv[1] , ANSIToUTF8(path.c_str()));
system(cmdbuf);
# include "clientapi.h"
# include "i18napi.h"
# include "CharSetConvertUtil.h"
# include <string>
# include <vector>
# include <list>
# include <io.h>
using namespace std;
// structure to hold a directory and all its filenames.
struct FILELIST
{
string path;
vector<string> theList;
};
void TransverseDirectory(string path, list<FILELIST>& theList)
{
struct _finddatai64_t data;
string fname = path + "\\*.*";
long h = _findfirsti64(fname.c_str(),&data);
if(h >= 0)
{
FILELIST thisList;
theList.push_back(thisList);
list<FILELIST>::iterator it = theList.end();
it--;
(*it).path = path;
do {
if( (data.attrib & _A_SUBDIR) )
{
// make sure we skip "." and "..". Have to use strcmp here because
// some file names can start with a dot, so just testing for the
// first dot is not suffient.
if( strcmp(data.name,".") != 0 &&strcmp(data.name,"..") != 0)
{
// We found a sub-directory, so get the files in it too
fname = path + "\\" + data.name;
// recurrsion here!
TransverseDirectory(fname,theList);
}
}
else
{
// this is just a normal filename. So just add it to our vector
(*it).theList.push_back(data.name);
}
}while( _findnexti64(h,&data) == 0);
_findclose(h);
}
}
int main( int argc, char **argv )
{
list<FILELIST> MyList;
string path;
ClientUser ui;
ClientApi client;
StrBuf msg;
Error e;
if(argc < 4)
{
fprintf( stderr , "P4 Transverse Add: Arguments Error!\n");
return -1;
}
client.SetPort(argv[1]);
client.SetClient(argv[2]);
client.SetTrans(CharSetApi::UTF_8 , CharSetApi::UTF_8 ,
CharSetApi::UTF_8,
CharSetApi::UTF_8);
TransverseDirectory(argv[3],MyList);
// Connect to server
client.Init( &e );
if( e.Test() )
{
e.Fmt( &msg );
fprintf( stderr, "%s\n", msg.Text() );
return -1;
}
list<FILELIST>::iterator it;
for(it = MyList.begin(); it != MyList.end(); it++)
{
vector<string>::iterator its;
for(its = (*it).theList.begin(); its != (*it).theList.end(); its++)
{
path = (*it).path + "\\" + (*its);
char* pText = ANSIToUTF8(path.c_str());
client.SetArgv( 1 , &pText);
client.Run( "add" , &ui );
}
}
// Close connection
client.Final( &e );
if( e.Test() )
{
e.Fmt( &msg );
fprintf( stderr, "%s\n", msg.Text() );
return -1;
}
return 0;
}
wchar_t* ANSIToUnicode( const char* str )
{
int textlen ;
wchar_t * result;
textlen = MultiByteToWideChar( CP_ACP, 0, str,-1, NULL,0 );
result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
memset(result,0,(textlen+1)*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen );
return result;
}
char* UnicodeToANSI( const wchar_t *str )
{
char * result;
int textlen;
// wide char to multi char
textlen = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );
result =(char *)malloc((textlen+1)*sizeof(char));
memset( result, 0, sizeof(char) * ( textlen + 1 ) );
WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL );
return result;
}
wchar_t* UTF8ToUnicode( const char* str )
{
int textlen ;
wchar_t * result;
textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1, NULL,0 );
result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
memset(result,0,(textlen+1)*sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen );
return result;
}
char* UnicodeToUTF8( const wchar_t *str )
{
char * result;
int textlen;
// wide char to multi char
textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );
result =(char *)malloc((textlen+1)*sizeof(char));
memset(result, 0, sizeof(char) * ( textlen + 1 ) );
WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );
return result;
}
char* ANSIToUTF8(const char* str)
{
wchar_t* pUnicodeBuff = ANSIToUnicode(str);
char* pUtf8Buff = UnicodeToUTF8(pUnicodeBuff);
free(pUnicodeBuff);
return pUtf8Buff;
}
]]>
1錛夌伒媧匯侀珮鍙厤緗э紝濡傦細澶氶噸緇勫悎鏉′歡瑙﹀彂銆佸浠誨姟闃熷垪絳栫暐錛?
2錛夊吋瀹圭洰鍓嶅嚑涔庢墍鏈夌殑嫻佽SCM宸ュ叿錛屼嬌寰楀縐嶅紓鏋勭郴緇熻兘澶熺敱CruiseControl.NET緇熶竴鐩戞帶鍜岀鐞嗭紱
3錛夊畬鍠勭殑浣跨敤鏂囨。錛屼嬌涓婃墜鍜岀淮鎶ゅ彉寰楀鏄擄紱
鑰岃欏圭洰寮曚互鑷豹鐨勪唬鐮乧heck in瑙﹀彂鏋勫緩鐨勫姛鑳介氳繃CC.NET涔熷緢瀹規槗瀹炵幇銆備箣鍓嶄嬌鐢ㄨ繃Hudson錛岃緋葷粺閲囩敤涓諱粠寮忔灦鏋勶紝浣跨敤鑰呴氳繃緗戦〉璁㎝aster鎺у埗Slave鍔ㄤ綔錛岀敱浜嶮aster鐢卞埆鐨勯儴闂ㄧ鐞嗭紝鍑洪棶棰樺悗闇瑕佽仈緋葷浉鍏充漢瑙e喅錛屼細鏈変竴瀹氱殑澶勭悊寤惰繜錛岃屼笖瀹夎鍦ㄦ瀯寤烘満涓婄殑Slave鏈嶅姟緇忓父宕╂簝銆傝孋C.NET鐩存帴瀹夎鍦ㄦ瀯寤烘満涓婏紝閰嶇疆IIS鍚庡彲閫氳繃緗戦〉鐩存帴璁塊棶錛屾搷浣滅淮鎶ら兘杈冨墠鑰呭鏄撱傜敱浜庝箣鍓嶇殑鏋勫緩鑴氭湰鏄敤VisualBuild瀹炵幇鐨勶紝鎵浠ヤ笉鍙兘鍐嶈姳鏃墮棿鐢–C.NET鍐嶅啓涓閬嶃傝岄氳繃瀹為獙寰楃煡錛屽叾瀹濩C.NET鑳藉浠xecutableTask鐨勫艦寮忓緢濂藉湴涓嶸isualBuild闆嗘垚錛岀洰鍓嶆瘡灝忔椂瀹氭椂鏋勫緩銆丯ightBuild鍜屾瀯寤烘垚鍔熷悗瑙﹀彂鐨勮嚜鍔ㄦ祴璇曢兘宸茬粡鏀懼埌浜咰C.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/
Jason Gregory鍦ㄤ粬鐨勫紩鎿庢灦鏋勮璁′竴涔︿腑涔熺敤鈥淭o SLERP or Not to SLERP (That鈥檚 Still the Question)鈥濅竴灝忚妭浠嬬粛浜嗗紑鍙戣呭Slerp鐨勪簤璁猴紝騫朵粙緇嶄粬鍦∟aughty Dog鐨勫悓浜嬮拡瀵筆S3鐨勪紭鍖栨柟娉曪紝浣縎lerp鍙揪鍒?0鍛ㄦ湡/鍏寵妭錛岀浉姣擫erp鐨?6.25鍛ㄦ湡/鍏寵妭宸茬粡寰堜笉閿欎簡銆?/p>
涔嬪墠紜疄娌″Slerp鐨勬晥鐜囬棶棰樹綔榪囧鐨勮冭檻錛屽紩鎿庣殑Slerp鐩存帴浣跨敤鐨勬槸D3DXQuaternionSlerp錛孧S搴旇瀵瑰叾鍋氫簡浼樺寲錛屾晥鐜囨庝箞鏍瘋嫻嬩竴涓嬫墠鐭ラ亾浜嗐?/p>

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;
}