游戏开发论坛

 找回密码
 立即注册
搜索
查看: 12287|回复: 11

GetTickCount 精度问题,有没有精度更高的函数/方法

[复制链接]

43

主题

229

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
QQ
发表于 2006-9-14 17:55:00 | 显示全部楼层 |阅读模式
API 函数 GetTickCount 的精度传说在豪秒(ms),但是实际上只有10ms或者以上(取决于不同机器,听说有的机器甚至到了20ms以上,我的机器就是11ms),满足不了要求啊,有没有人知道精度更高的方法呢?
知道的希望可以提供详细说明!
实用的话还给积分!

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2006-9-14 17:59:00 | 显示全部楼层

Re:GetTickCount 精度问题,有没有精度更高的函数/方法

怎么GetTickCount的精度才那么低??是不是到时间时执行的代码太多了??

43

主题

229

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
QQ
 楼主| 发表于 2006-9-14 18:05:00 | 显示全部楼层

Re:GetTickCount 精度问题,有没有精度更高的函数/方法

timeGetTime精度也是的……只有10ms左右,严重的受不了啊

43

主题

229

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
QQ
 楼主| 发表于 2006-9-14 18:07:00 | 显示全部楼层

Re:GetTickCount 精度问题,有没有精度更高的函数/方法

虽然timeGetTime返回值的单位是1ms,但实际上它的精度只有10ms左右。
    如果想提高精度,可以使用QueryPerformanceCounter和QueryPerformanceFrequency。这两个函数不是在每个系统中都支持。对于支持它们的系统中,可以获得低于1ms的精度。Windows 内部有一个精度非常高的定时器, 精度在微秒级, 但不同的系统这个定时器的频率不同, 这个频率与硬件和操作系统都可能有关。利用 API 函数 QueryPerformanceFrequency 可以得到这个定时器的频率。利用 API 函数 QueryPerformanceCounter 可以得到定时器的当前值。根据要延时的时间和定时器的频率, 可以算出要延时的时间定时器经过的周期数。在循环里用 QueryPerformanceCounter 不停的读出定时器值, 一直到经过了指定周期数再结束循环, 就达到了高精度延时的目的。例如:
    Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long
    Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long
     
    ' DelayNum为延时的毫秒数
    Private Sub DelayTime(ByVal DelayNum As Long)
     Dim Ctr1, Ctr2, Freq As Currency
     Dim Count As Double
     
     If QueryPerformanceFrequency(Freq) Then
     QueryPerformanceCounter Ctr1
     Do
     QueryPerformanceCounter Ctr2
     Loop While (Ctr2 - Ctr1) / Freq * 1000 < DelayNum
     Else
     MsgBox "不支持高精度计数器!"
     End If
    End Sub
     
    不过,Windows不是实时操作系统,如果任务太多,或者有其他中断请求,都可能导致程序运行时的延迟不精确,一般的Windows程序也可以接受。如果你对时间精度要求很高,一般只有使用Windows的实时扩展RTX,或者使用其他实时操作系统,如VXWorks等。



以上是网上的资料,有的机器可能不支持啊,让我很头疼

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2006-9-14 18:09:00 | 显示全部楼层

Re:GetTickCount 精度问题,有没有精度更高的函数/方法

float GetTime()
{
  static bool init = false;
  static bool hires = false;
  static __int64 freq = 1;
  if(!init)
  {
    hires = !QueryPerformanceFrequency((LARGE_INTEGER *)&freq);
    if(!hires)
      freq = 1000;
    init = true;
  }

  __int64 now;

  if(hires)
    QueryPerformanceCounter((LARGE_INTEGER *)&now);
  else
    now = GetTickCount();

  return (float)((double)now / (double)freq);
}

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2006-9-14 18:10:00 | 显示全部楼层

Re:GetTickCount 精度问题,有没有精度更高的函数/方法

C好像比VB效率高~~~

43

主题

229

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
QQ
 楼主| 发表于 2006-9-14 18:15:00 | 显示全部楼层

Re: Re:GetTickCount 精度问题,有没有精度更高的函数/方法

Miu.C: Re:GetTickCount 精度问题,有没有精度更高的函数/方法

C好像比VB效率高~~~

C的效率当然比VB高……

15

主题

2093

帖子

2093

积分

金牌会员

Rank: 6Rank: 6

积分
2093
发表于 2006-9-14 19:14:00 | 显示全部楼层

Re:GetTickCount 精度问题,有没有精度更高的函数/方法

小心,被某人看到又要吵起来了

270

主题

6442

帖子

6446

积分

论坛元老

Rank: 8Rank: 8

积分
6446
发表于 2006-9-14 21:03:00 | 显示全部楼层

Re: Re:GetTickCount 精度问题,有没有精度更高的函数/方法

psic: Re:GetTickCount 精度问题,有没有精度更高的函数/方法

小心,被某人看到又要吵起来了


你是挑拨者,你写不出游戏所以喜欢找碴。

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2006-9-15 08:40:00 | 显示全部楼层

Re:GetTickCount 精度问题,有没有精度更高的函数/方法

怎么是不一定呢??不是制作的效率,是程序执行的效率。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 10:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表