关于windows的时间函数(timeGetTime,QueryPerformanceCounter)不准确

udragon 2007-04-05 12:34:39
当游戏中用到大量纹理处理,如Render to texture之类的操作函数的时候,很多机器上会出现获取的时间不正确.
具体表现是,假设一个实际1000毫秒的时间,游戏若有10帧,那么每帧获得的时间差应该是100毫秒左右(实际上真正的耗时也是100毫秒),但是通过timeGetTime或QueryPerformanceCounter得到的时间差,会发生前9帧是90,最后后一帧是200左右.也就是前面获得的时间比实际的时间短,后面一帧的时间比实际长很多(就像是为了弥补前面的时间错误,硬加上一段时间),长期来看时间是正常的,但会导致没帧时间的错乱.请问有没人遇到这个问题.
另外就是,以前很少机器会出现这个问题,最近越来越多机器出现这个问题.

这个情况出现是会在所有图形程序上出现的,比如我们的游戏和<激战>等,开了最佳效果就会出现,跑几帧,跳一帧的情况,有可能是某个微软补丁出的问题吗?
...全文
1088 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
udragon 2007-04-13
  • 打赏
  • 举报
回复
因为距离和时间成正比,所以170ms移动的距离和120移动的距离是不一样的,而且这个东西是只是举例,我实际中碰到的是,30帧速率的程序(用fraps测),居然经常有获得到130ms的帧间隔时间,若是把突变的帧间隔时间变为33ms,那么整个移动的流畅性就保持了,否则就会有一帧移动很远.
若是实际真的是有130ms的话,那么情况应该会是在我修改了时间之后有一帧会停一会不移动
limiteee 2007-04-12
  • 打赏
  • 举报
回复
你怎么知道不对?170ms和120ms你能感觉出来?

QueryPerformanceCounter是cpu的时钟,这东西具体怎么回事我不知道,不是搞硬件的,很准就是了

有一个devpartner的工具,可以进行程序性能测试,看什么地方用的时间是多少,你可以用用看,很方便的工具
FatGarfield 2007-04-10
  • 打赏
  • 举报
回复
帧速率在不断变化是正常的。编游戏的时候不会用定时器的,都会用查询的方式来绘制动画。
udragon 2007-04-10
  • 打赏
  • 举报
回复
不是定时器啊,就是每帧通过那两个函数得到的时间来判定两帧之间应该动画跑多快,但是那个时间和实际的时间不对.
udragon 2007-04-08
  • 打赏
  • 举报
回复
另外,窗口模式下,我没有进行垂直同步的设置
udragon 2007-04-08
  • 打赏
  • 举报
回复
面9次都是小于100,后面的一次大于200的情况若是偶然我就不会发这个贴了,这个情况会是连续的但时间间隔不一定.一般每0.x秒到1.x秒出现一次
udragon 2007-04-08
  • 打赏
  • 举报
回复
实际的情况就是会不断出现本来是89 120 90 130 120 110 的帧速率变为可能是79 110 80 120 110 170,这样的情况,就是总时间是对的,但是每一帧通过那两个函数返回的时间都是不对的.
寻开心 2007-04-06
  • 打赏
  • 举报
回复
两个问题混在一起了

首先游戏的渲染速度的问题, 他很少会是一个时间控制函数, 你说1秒钟绘制10帧是可以的, 但是你要精确控制每100ms绘制一帧是很难的.
每一帧都要更新一次画面, 生成画面用的时间一定都能保证小于100ms吗? 不一定. 在不同的机器上, 上场景的不同时刻, 用户的不同的操作下, 这个渲染时间都是变化的. 基本上不可能控制在刚好100ms上,总有多的时候,和少的时候. 10帧, 也许大致的时间分布是 89 120 90 130 120 80 ... 这样的, 如果前面9次都是小于100,后面的一次大于200的情况太偶然了. 往往都是一段时间内有微小的变化.

在实际实践的过程当中,如果用dx或者opengl实现, 由于程序设置的原因,可能实际的刷新速度收到显示器的刷新次数的显示, 一次垂直回显过程当中只能刷新屏幕一次. 会有可能造成实际的帧率相差较大. 这种情况存在, 但是可以通过程序设置修改它,回避它.

速度的控制是另外一个问题, 知道有帧时间不同的这个实际情况, 在设计的时候就要回避它.
我们不能假定帧时间和刷新速度是多少, 而是固定一个运动速度,计算出实际的帧时间,用速度和时间做乘法得到实际的运动距离, 这样物体的运动就不会跳跃,而是连续的稳定的

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧