游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5337|回复: 12

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

[复制链接]

4

主题

45

帖子

45

积分

注册会员

Rank: 2

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

另外就是,以前很少机器会出现这个问题,最近越来越多机器出现这个问题.

这个情况出现是会在所有图形程序上出现的,比如我们的游戏和<激战>等,开了最佳效果有些机器上就会出现,跑几帧,跳一帧的情况,有可能是某个微软补丁出的问题吗?

4

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
发表于 2007-4-5 12:51:00 | 显示全部楼层

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

我感觉是跟显卡对指令的优化操作有关,有些指令会有延迟运行的可能。在OpenGL中,建议用glFinish来强制执行所有指令,再来获取时间,应该就比较准了。但是glFinish也会占用程序时间,可以绘多帧取平均:
glFinish();
const int start = timeGetTime
Render N frames, where N is large.
glFinish();
const int end = timeGetTime
const float fps = (float)( end  start ) / (float)N;

4

主题

45

帖子

45

积分

注册会员

Rank: 2

积分
45
 楼主| 发表于 2007-4-5 13:13:00 | 显示全部楼层

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

但是只要强制让每帧给程序的时间设为定值就不会有跳帧,跳帧是因为游戏运行所用的时间是来自于那两个函数,所以每帧实际用时是相等的,但得到的时间不等,人物移动的速度就不一样了,就有一帧移动的很远,就"跳"了过去

4

主题

45

帖子

45

积分

注册会员

Rank: 2

积分
45
 楼主| 发表于 2007-4-5 13:14:00 | 显示全部楼层

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

另外,dx里面present的应该也是强制渲染完才能提交的吧

6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2007-4-5 16:15:00 | 显示全部楼层

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

你确认每一帧花的时间一样么

4

主题

45

帖子

45

积分

注册会员

Rank: 2

积分
45
 楼主| 发表于 2007-4-6 13:10:00 | 显示全部楼层

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

是啊,只要把得到的时间变为稳定的时间,比如90,90,90,130=>100,100,100,100, 整个运行就是流畅的,不会发生任何跳帧或者缓慢.

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2007-4-6 20:14:00 | 显示全部楼层

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

....这样做不好的地方,已经有很多人讨论过了。

0

主题

172

帖子

176

积分

注册会员

Rank: 2

积分
176
发表于 2007-4-7 00:04:00 | 显示全部楼层

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

越精确的计时器,误差也越大,它甚至会把进程间切换,OS内核的操作时间也给记进去。(对于系统内核来说,任务其实也是时间片串行的)
而且QueryPerformanceCounter,CPU的单双核也对其有影响

4

主题

45

帖子

45

积分

注册会员

Rank: 2

积分
45
 楼主| 发表于 2007-4-7 09:50:00 | 显示全部楼层

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

timeGetTime得到的时间也是一样的.如果说这个都不能保证,那么还有什么可以做游戏的计时器呢?

60

主题

134

帖子

134

积分

注册会员

Rank: 2

积分
134
QQ
发表于 2007-4-7 10:42:00 | 显示全部楼层

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

关注中!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-4-12 12:39

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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