注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

简约男人

简约,不能简单

 
 
 

日志

 
 
关于我

一个过分渴望被理解的人其实就是一个软弱的人, 勇往直前的力量来自斩钉截铁的决心,不是来自别人的理解.

网易考拉推荐

【引用】高精度计时器  

2011-11-02 11:19:22|  分类: 高级开发知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文转载自秒大刀《高精度计时器》
    以前写游戏时习惯用QueryPerformanceFrequencyQueryPerformanceCounter来做高精度计时器。DirectX SDK自带的DXUT中有个CDXUTTimer就是这么用的。很多应用都会建立在高精度计时器上,计时器的精度可以在一定程度上影响游戏帧率的准确、稳定。

     但要注意QueryPerformanceFrequency函数在多核CPU上是有猫腻的:
    On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL). To specify processor affinity for a thread, use the SetThreadAffinityMask function. (MSDN)
    QPF还可能面临向前回退的问题(Performance counter value may unexpectedly leap forward),而且在一些操作系统上也可能表现很差(Programs that use the QueryPerformanceCounter function may perform poorly in Windows Server 2000, in Windows Server 2003, and in Windows XP)。这些无疑给了接口优美貌似好用的QPF当头一棒——停!
    我自己的AMD双核CPU在QueryPerformanceCounter函数实现上就存在上述的BUG!只有打了“AMD dual core optimizer”补丁后才能正常工作。
    游戏在部署时一般采用无需管理员权限的xcopy方式,所以不能保证玩家机器上打过该补丁,帮用户安装还会遇到权限问题。

    timeGetTime是Windows Multimedia中获取高精度时间的另外一种方式。在NT和2000系统以后,该方法默认精度为5ms,通过timeBeginPeriodtimeEndPeriod可以将精度调整到1ms。
    那为什么timeGetTime精度上只能达到1ms呢?
    “最初设计IBM-PC的时候,主板上用了一个14.31818MHz的晶振,这是当时PC上最高的时钟频率了。这个晶振经过12分频后作为定时器/计数器的输入,就是1.1931816MHz。为了保持兼容,这个1.1931816MHz是一直存在的,直到现在的主板也是如此(不管它是如何产生的),那个14.31818倒是不一定存在了。这就是为什么QueryPerformanceFrequency通常会返回1193182这个数字的原因。在这个频率下,计时的最高精度是834ns”(CSDN)
高精度计时器 - 秒大刀 - 秒大刀的城堡
结论:
    暂时放弃QueryPerformanceFrequency方式。
   RDTSC指令比较高深,暂时还不敢用,我想也不至于用。
    先选定timeGetTime的1ms精度计时器。
 

参考:

2010-12-30
感谢宋传波推荐另外两篇时间相关的文章:

2011-9-13
    Ogre::Timer中使用 QueryPerformanceCounter、GetTickCount 和 clock 三种时间函数,写法很严密。值得借鉴。

参考:
  评论这张
 
阅读(523)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017