﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Bill Hsu</title><link>http://www.cppblog.com/billhsu/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 03 Apr 2026 18:21:10 GMT</lastBuildDate><pubDate>Fri, 03 Apr 2026 18:21:10 GMT</pubDate><ttl>60</ttl><item><title>Android游戏计时</title><link>http://www.cppblog.com/billhsu/archive/2011/01/30/139627.html</link><dc:creator>Bill Hsu</dc:creator><author>Bill Hsu</author><pubDate>Sun, 30 Jan 2011 15:16:00 GMT</pubDate><guid>http://www.cppblog.com/billhsu/archive/2011/01/30/139627.html</guid><wfw:comment>http://www.cppblog.com/billhsu/comments/139627.html</wfw:comment><comments>http://www.cppblog.com/billhsu/archive/2011/01/30/139627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/billhsu/comments/commentRss/139627.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/billhsu/services/trackbacks/139627.html</trackback:ping><description><![CDATA[
Read this post in english:<a target="_blank" href="http://androgeek.info/?p=299">http://androgeek.info/?p=299<br></a><br>以前代码经验很多都是基于windows的，所以对android下面的计时函数不是太了解。<br><br>在写<a target="_blank" href="http://hi.baidu.com/probill/blog/item/16945fde1f86005b94ee37bb.html">Friut3D</a>时，我用的代码是用gettimeofday()来计时的。但是效果不好，游戏里有个场景跑起来十分卡，acepig兄和我都觉得这个问题很诡异。开始觉得这是模型的问题，现在看来是计时函数不精确惹得祸。<br><br>看看当时写的获取系统时间的代码：<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;getTime(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br><br>{<br>gettimeofday(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">now,&nbsp;NULL);<br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">long</span><span style="color: #000000;">)(now.tv_sec</span><span style="color: #000000;">*</span><span style="color: #000000;">1000</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;now.tv_usec</span><span style="color: #000000;">/</span><span style="color: #000000;">1000</span><span style="color: #000000;">);<br>}</span></div>
<br><br>今天在一个google讨论组里得知gettimeofday()记得的tick是不准确的。而这个游戏逻辑依赖于time delta来计算各个物体运动，计时不精确，渲染自然会卡顿。<br><br>于是用纳秒级的准确度的clock_gettime()重写了getTime()函数：<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;_getTime(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br><br>{<br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;timespec&nbsp;now;<br>clock_gettime(CLOCK_MONOTONIC,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">now);<br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;now.tv_sec</span><span style="color: #000000;">*</span><span style="color: #000000;">1000000</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;now.tv_nsec</span><span style="color: #000000;">/</span><span style="color: #000000;">1000</span><span style="color: #000000;">;<br><br>}</span></div>
<br><br>改了计时函数后，游戏各个场景都流畅了。<br>  <img src ="http://www.cppblog.com/billhsu/aggbug/139627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/billhsu/" target="_blank">Bill Hsu</a> 2011-01-30 23:16 <a href="http://www.cppblog.com/billhsu/archive/2011/01/30/139627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>骨骼动画中的反向动力学</title><link>http://www.cppblog.com/billhsu/archive/2010/08/26/124852.html</link><dc:creator>Bill Hsu</dc:creator><author>Bill Hsu</author><pubDate>Thu, 26 Aug 2010 09:29:00 GMT</pubDate><guid>http://www.cppblog.com/billhsu/archive/2010/08/26/124852.html</guid><wfw:comment>http://www.cppblog.com/billhsu/comments/124852.html</wfw:comment><comments>http://www.cppblog.com/billhsu/archive/2010/08/26/124852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/billhsu/comments/commentRss/124852.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/billhsu/services/trackbacks/124852.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;">IK在骨骼动画里常常能看到，作用就是根据子骨骼的方位推算出它的那些父骨骼方位。可是一直都是知道有那么回事，但是又不太知道具体是怎么实现的。<br />在multi-crash.com上看到一篇<a target="_blank" href="http://multi-crash.com/?p=45"><span style="font-style: italic;">骨骼动画反向动力学(IK)的实现&nbsp; </span></a>，内容写的很易懂。<br />这是基于CCD(</span>Cyclic Coordinate Descent<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;">)算法的。还有种雅可比矩阵的算法，不过这种算法我还不太清楚，希望高手指教啊。<br />下面讲讲CCD，先看这张图。<br /><img style="width: 540px; height: 214px;" src="http://www.cppblog.com/images/cppblog_com/billhsu/ccd.gif" border="0"  alt="" /><br />注意图中的红线和绿线，红线是当前骨骼与目标骨骼的连线，绿线是目标骨骼与最终位置的连线。<br />从子骨骼到父骨骼的顺序迭代计算，旋转红线到绿线。这样多迭代几次就会得到较好的结果。<br /><br />要注意的是需要对骨骼的旋转范围加以限制，因为人体的关节不是以可以任意方式旋转的。<br /><img src="http://www.cppblog.com/images/cppblog_com/billhsu/ccd3.JPG" border="0"  alt="" /><br />[例如图中蓝色部分为可以旋转的范围]<br /><br /><span style="font-style: italic;"></span></span><img src ="http://www.cppblog.com/billhsu/aggbug/124852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/billhsu/" target="_blank">Bill Hsu</a> 2010-08-26 17:29 <a href="http://www.cppblog.com/billhsu/archive/2010/08/26/124852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AndroGeek欢迎大家</title><link>http://www.cppblog.com/billhsu/archive/2010/08/23/124373.html</link><dc:creator>Bill Hsu</dc:creator><author>Bill Hsu</author><pubDate>Mon, 23 Aug 2010 02:04:00 GMT</pubDate><guid>http://www.cppblog.com/billhsu/archive/2010/08/23/124373.html</guid><wfw:comment>http://www.cppblog.com/billhsu/comments/124373.html</wfw:comment><comments>http://www.cppblog.com/billhsu/archive/2010/08/23/124373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/billhsu/comments/commentRss/124373.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/billhsu/services/trackbacks/124373.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="color: #333333; font-family: Tahoma,Verdana,STHeiTi,simsun,sans-serif; font-size: 14px; line-height: 21px;">
<p style="margin: 0px 0px 0.8em; padding: 0px;"><a  href="http://androgeek.info/" style="margin: 0px; padding: 0px; color: #005eac; cursor: pointer; text-decoration: none;">http://androgeek.info/</a></p>
<p style="margin: 0px 0px 0.8em; padding: 0px;">AndroGeek[安卓极客]是我正在办的一个网站，内容以Android 编程开发与资讯为主。</p>
<p style="margin: 0px 0px 0.8em; padding: 0px;">如果有好的Logo创意或者有写Android相关的文章的想法，请联系我～～～</p>
<p style="margin: 0px 0px 0.8em; padding: 0px;"><a  href="http://androgeek.info/" target="_blank" style="margin: 0px; padding: 0px; color: #005eac; cursor: pointer; text-decoration: none;">AndroGeek</a>欢迎大家。</p>
<p style="margin: 0px 0px 0.8em; padding: 0px;">&nbsp;</p>
<p style="margin: 0px 0px 0.8em; padding: 0px;">[为了国际化，这是一个英文站点]</p>
</span></span><img src ="http://www.cppblog.com/billhsu/aggbug/124373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/billhsu/" target="_blank">Bill Hsu</a> 2010-08-23 10:04 <a href="http://www.cppblog.com/billhsu/archive/2010/08/23/124373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android NDK 开发OpenGL ES 2.0一些注意点</title><link>http://www.cppblog.com/billhsu/archive/2010/08/10/122914.html</link><dc:creator>Bill Hsu</dc:creator><author>Bill Hsu</author><pubDate>Tue, 10 Aug 2010 03:37:00 GMT</pubDate><guid>http://www.cppblog.com/billhsu/archive/2010/08/10/122914.html</guid><wfw:comment>http://www.cppblog.com/billhsu/comments/122914.html</wfw:comment><comments>http://www.cppblog.com/billhsu/archive/2010/08/10/122914.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/billhsu/comments/commentRss/122914.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/billhsu/services/trackbacks/122914.html</trackback:ping><description><![CDATA[Android是个好系统哇，特别是Android NDK r3出来以后，可以用OpenGL ES 2.0了。<br>自己也试了试用NDK编一个OpenGL ES 2.0的程序，可是，编译的时候出现了一大堆错。<br><img style="width: 592px; height: 392px;" src="http://www.cppblog.com/images/cppblog_com/billhsu/jni1.JPG" border="0"><br>如图，满屏幕都是 undefined reference to 那些OpenGL ES函数。<br>看来是库文件没有链接进来。<br><br>这是NDK例子里的Android.mk的写法：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">LOCAL_PATH:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;$(call&nbsp;my</span><span style="color: #000000;">-</span><span style="color: #000000;">dir)<br><br>include&nbsp;$(CLEAR_VARS)<br><br>LOCAL_MODULE&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;libgl2jni<br>LOCAL_CFLAGS&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">Werror<br>LOCAL_SRC_FILES&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;gl_code.cpp<br><span style="color: red;">LOCAL_LDLIBS&nbsp;&nbsp;&nbsp;&nbsp;:</span></span><span style="color: red;">=&nbsp;-llog&nbsp;-</span><span style="color: #000000;"><span style="color: red;">lGLESv2</span><br><br>include&nbsp;$(BUILD_SHARED_LIBRARY)</span></div>
<br>问题就出在用红色标出的那行。<br><br>把那句修改为：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">LOCAL_LDLIBS&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">L$(SYSROOT)</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">llog<br>LOCAL_LDLIBS</span><span style="color: #000000;">+=-</span><span style="color: #000000;">L$(SYSROOT)</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">lib&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">lGLESv2</span></div>
<br>就可以正常编译了。<br><br>还有一些注意点是：<br>编译程序前要clean，否则编译会出错；<br>每次更新了自己的.so文件后，在eclipse的那个java项目里要记着refresh一下。<br><br>  <img src ="http://www.cppblog.com/billhsu/aggbug/122914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/billhsu/" target="_blank">Bill Hsu</a> 2010-08-10 11:37 <a href="http://www.cppblog.com/billhsu/archive/2010/08/10/122914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>靠得住的休眠函数XSleep</title><link>http://www.cppblog.com/billhsu/archive/2010/07/30/121679.html</link><dc:creator>Bill Hsu</dc:creator><author>Bill Hsu</author><pubDate>Fri, 30 Jul 2010 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/billhsu/archive/2010/07/30/121679.html</guid><wfw:comment>http://www.cppblog.com/billhsu/comments/121679.html</wfw:comment><comments>http://www.cppblog.com/billhsu/archive/2010/07/30/121679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/billhsu/comments/commentRss/121679.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/billhsu/services/trackbacks/121679.html</trackback:ping><description><![CDATA[直接用timeGetTime()这个函数的误差是有目共睹的，在15ms左右，于是，如果游戏的消息循环用了timeGetTime()，那么3D游戏画面会因为两帧之间时间误差大而有些抖动。<br>今天在csdn上看到了一篇文章：<a href="http://blog.csdn.net/lanzhengpeng2/archive/2008/05/06/2401554.aspx">http://blog.csdn.net/lanzhengpeng2/archive/2008/05/06/2401554.aspx</a><br>讲的也正好是这个问题，记录一下。<br><br>在使用timeGetTime()的代码块的前后加上<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-family: verdana,sans-serif; font-size: 14px; line-height: 21px; text-align: left;">timeBeginPeriod(1)和</span></span><span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-family: verdana,sans-serif; font-size: 14px; line-height: 21px; text-align: left;">timeEndPeriod(1)，就可以提高</span></span>timeGetTime()的精度。<br><br>同时，可以利用timeSetEvent写了一个靠得住的休眠函数[代码来自上述文章]：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;XSleep(DWORD&nbsp;dwDelay,HANDLE&nbsp;hEvent)<br>&nbsp;{<br>&nbsp;&nbsp;MMRESULT&nbsp;hTimer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;timeSetEvent(dwDelay,</span><span style="color: #000000;">1</span><span style="color: #000000;">,(LPTIMECALLBACK)hEvent,</span><span style="color: #000000;">0</span><span style="color: #000000;">,TIME_ONESHOT&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;TIME_CALLBACK_EVENT_SET);<br>&nbsp;&nbsp;MsgWaitForMultipleObjectsEx(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">hEvent,INFINITE,QS_ALLINPUT,</span><span style="color: #000000;">0</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">当有Windows消息时，还能继续处理Windows消息。故选择了这个函数。</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;timeKillEvent(hTimer);<br>&nbsp;}</span></div>
<br>消息循环[代码来自上述文章]：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;MSG&nbsp;msg;<br>&nbsp;DWORD&nbsp;dwLastTime;<br>&nbsp;HANDLE&nbsp;hSleepEvent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CreateEvent(NULL,FALSE,FALSE,NULL);<br><br>&nbsp;timeBeginPeriod(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br><br>&nbsp;dwLastTime&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;timeGetTime();<br>&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(isActive())<br>&nbsp;{<br>&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">需要一直处理Windows消息到无消息处理为止</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(;PeekMessage(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">msg,NULL,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,PM_REMOVE);)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(msg.message&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;WM_QUIT)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hSleepEvent);<br>&nbsp;&nbsp;&nbsp;&nbsp;timeEndPeriod(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">TranslateAccelerator(msg.hwnd,hAccelTable,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">msg))<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">msg);<br>&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">msg);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;DWORD&nbsp;FrameDelay&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;max(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1000</span><span style="color: #000000;">/</span><span style="color: #000000;">max(</span><span style="color: #000000;">1</span><span style="color: #000000;">,GetMaxFPS()));<br>&nbsp;&nbsp;DWORD&nbsp;dwTime&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;timeGetTime();<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(dwLastTime&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;FrameDelay&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;dwTime)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;XSleep(dwLastTime&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;FrameDelay&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;dwTime,hSleepEvent);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;update();<br>&nbsp;&nbsp;&nbsp;dwLastTime&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;((dwTime&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;dwLastTime)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;FrameDelay)&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FrameDelay;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">当实际帧数严重低于预期帧数时，这段代码可以完成跳帧功能；当实际帧数大于等于预期帧数时，这段代码仍然可以使帧之间的时间间隔固定。之前谢Boss没有处理好的主要就是这个。</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;}<br>&nbsp;}<br><br>&nbsp;CloseHandle(hSleepEvent);<br>&nbsp;timeEndPeriod(</span><span style="color: #000000;">1</span><span style="color: #000000;">);</span></div>
这样，时间误差就会在1ms之内了，游戏也就不会抖动了。<br> <img src ="http://www.cppblog.com/billhsu/aggbug/121679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/billhsu/" target="_blank">Bill Hsu</a> 2010-07-30 10:55 <a href="http://www.cppblog.com/billhsu/archive/2010/07/30/121679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>