游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9251|回复: 17

D3d里面的刷新率,或者是fps.究竟该怎样理解?小弟实在

[复制链接]

12

主题

50

帖子

70

积分

注册会员

Rank: 2

积分
70
发表于 2005-9-7 21:33:00 | 显示全部楼层 |阅读模式
D3d里面的刷新率,或者是fps.究竟该怎样理解?小弟实在是一头雾水

初学d3d,初学游戏编程,一路拷贝代码,死磕sdk,能走到今天也算不容易了,眼看第一个游戏就要成了,却遇到如下致命问题

我用的是Sprite接口做2d的绘图,发现在有的机器上精灵运动很流畅,而到了有的机器上则会卡,不是一直卡,而是有时卡,卡的时候渲染的速度正好变成原来的一半左右(或者说是这两桢的间隔变成原来的两倍)
我总结了一下,我渲染的东西非常少,应该每次渲染时间相差很少,问题可能出在刷新率上面

下面是我的一些想法,哪位高手能给些指点么?小弟不胜感激

1,
初始化的时候,设置了这个变量:
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_ONE ;

这个d3dpp.PresentationInterval还可以设置成
D3DPRESENT_INTERVAL_DEFAULT 或者
D3DPRESENT_INTERVAL_IMMEDIATE
这个设置和刷新率有关系吧?sdk中似乎推荐用D3DPRESENT_INTERVAL_ONE 。当我用D3DPRESENT_INTERVAL_ONE 时,刷新率可以稳定在85Hz,这和我的显示控制面版里的刷新率是一样的,运行得非常好,我很满意。但只是在有的机器上这样,在我的Geforce4,普通显示屏上如此;但当我我换了一台机器,它的显示控制面版里的刷新率是75Hz,液晶屏,集成显卡,这时我能看出大部分时候还是和刷新率保持一致,但常常会出现如上所说的那样的卡,这使得画面很不流畅。这到底是怎么回事?这项设置究竟做了什么?
2,
显示设置里面的刷新率和上面这个是什么关系?我在后一台的机器上把显示器刷新率设置成60后,情况会有所好转,把参数设置成D3DPRESENT_INTERVAL_IMMEDIATE 后也会有所好转.

3,
我该限制游戏的桢数吗?我希望能尽可能平滑的显示出精灵的移动,希望不管当前显示器的刷新率如何都可以尽可能的提高桢数,该怎么做才好呢?



0

主题

237

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2005-9-8 10:56:00 | 显示全部楼层

Re:D3d里面的刷新率,或者是fps.究竟该怎样理解?小弟实在

FPS本身的意?, 是?算PC每秒能更新?面多小次, 如果你?定刷新率, FPS便??]意思了.

用 D3DPRESENT_DONOTWAIT ?黻P?"?定刷新率", 你的FPS才???得有意?, 但你???α硪?????, 就是不同的刷新率, ??虻乃俣染??煌 (即不同PC??胁煌?俣?.

如果你要平滑的移?? 最小也要有30FPS, 你要?量令??? 最小能在30FPS下?行便可以了.

2

主题

177

帖子

177

积分

注册会员

Rank: 2

积分
177
发表于 2005-9-8 10:58:00 | 显示全部楼层

Re:D3d里面的刷新率,或者是fps.究竟该怎样理解?小弟实在

卡可能是很多原因导致的,但最好限帧数,因为现在显卡驱动控制面板内的VSync选项都可以override掉你在游戏里的设置
游戏的帧数控制受很多因素影响,要解决好很麻烦,我记得Gem2还是3中有一篇文章里有一些帧数控制的理论,你可以找一下

2

主题

177

帖子

177

积分

注册会员

Rank: 2

积分
177
发表于 2005-9-8 11:14:00 | 显示全部楼层

Re: Re:D3d里面的刷新率,或者是fps.究竟该怎样理解?小弟

nlo: Re3d里面的刷新率,或者是fps.究竟该怎样理解?小弟实在是一头雾水

FPS本身的意?, 是?算PC每秒能更新?面多小次, 如果你?定刷新率, FPS便??]意思了.

用 D3DPRESENT_DON...


应该不是指“PC每秒能更新画面多少次”,而是“每秒能执行多少次游戏循环”,还包括了AI、输入处理等等,以QUAKE这些主流游戏和引擎为例,它们的帧数限制是在 updateWorld() 上的,而 updateDisplay() 是能够以异步的方式运行,一秒种的时间内可能 updateWorld() 执行了60次,而 updateDisplay() 却调用了200次,其中有很多次的画面都是相同的,只是简单地把它 update 到屏幕上而已
如果简单地把屏幕刷新的次数做为帧数来决定其它一切的话显然是不太合适的, 游戏最重要的是交互,一个高刷新率低交互率的游戏肯定让人受不了
所以后来很多人提出实时刷新的游戏最低帧率应在60而不是30,因为电影、动画领域的24或30帧是针对无交互而言
相信诸位都体验过60帧和30帧跑同一个游戏时交互感的巨大差异吧

12

主题

50

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2005-9-8 11:19:00 | 显示全部楼层

Re:D3d里面的刷新率,或者是fps.究竟该怎样理解?小弟实在

谢谢,我去再看看:)

8

主题

109

帖子

127

积分

注册会员

Rank: 2

积分
127
发表于 2005-9-8 15:44:00 | 显示全部楼层

Re:D3d里面的刷新率,或者是fps.究竟该怎样理解?小弟实在

D3DPRESENT_INTERVAL_DEFAULT等同于D3DPRESENT_INTERVAL_ONE。
D3DPRESENT_INTERVAL_IMMEDIATE不被硬件支持时,运行库自动用blit拷贝后台到前台来实现。
可能的原因是你的集成显卡的机器性能太差,运行时达不到高的帧数造成。具体还得看了代码才知道。

12

主题

50

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2005-9-8 19:44:00 | 显示全部楼层

Re:D3d里面的刷新率,或者是fps.究竟该怎样理解?小弟实在

谢谢楼上各位的指点;)
实际上我的程序并不要求多高的桢数,这是一个类似于劲乐团的音乐游戏,我只求它能拥有稳定的桢数,只要稳定,哪怕只有30的fps也可以,但任何的跳桢都会造成视觉上的不适。但我发现要做到这点却出乎我想象的困难。
我在游戏中并不限制桢数,而且我还是很确定我的游戏每次渲染都很快,我也测试过了,当我用D3DPRESENT_INTERVAL_IMMEDIATE时,刷新一次只要3,4毫秒,但后台声音却会撕裂,而且画面也没有D3DPRESENT_INTERVAL_ONE平滑。当我用 D3DPRESENT_INTERVAL_DEFAULT时桢数就不稳定了,很奇怪的是当我后台有个Flash在播放的时候还会稳定起来。最后当我用D3DPRESENT_INTERVAL_ONE时,在我的机器上才实现了完美的运行。但换了机器之后却不能保证也是如此了。
我不大清楚D3DPRESENT_INTERVAL_ONE究竟是做了什么,它似乎是在刷新时迁就着当前屏幕的刷新率。如果过快它会等一下在刷新。看起来似乎很好,但在换了一台机器后却会跳桢,观察每次渲染的时间时,大部分是13ms,但有时候却是25,26这样子,因此造成了跳桢。

换了后的这台机器虽然是集成显卡,但却有3g的cpu,512的内存。运行wow 都还比较流畅,所以和性能应该没有关系吧,唯一的不同就是刷新率,这台是75Hz,家里是85Hz,还有这台显存是从内存里面划的。


我只能总结出这么多了。估计问题出在刷新率的设置上。

16

主题

114

帖子

114

积分

注册会员

Rank: 2

积分
114
发表于 2005-9-8 21:15:00 | 显示全部楼层

Re:D3d里面的刷新率,或者是fps.究竟该怎样理解?小弟实在

对啊,我也碰到这种问题,比如说匀速的子弹,但有明显快快慢(有规律的交替出现)。特别在窗口最大化时候最明显。
我只好限帧处理了,但速度慢了很多。

0

主题

237

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2005-9-9 00:40:00 | 显示全部楼层

Re: Re: Re:D3d里面的刷新率,或者是fps.究竟该怎样理解?小

以QUAKE这些主流游戏和引擎为例,它们的帧数限制是在 updateWorld() 上的,而 updateDisplay() 是能够以异步的方式运行,一秒种的时间内可能 updateWorld() 执行了60次,而 updateDisplay() 却调用了200次,其中有很多次的画面都是相同的,只是简单地把它 update 到屏幕上而已
如果简单地把屏幕刷新的次数做为帧数来决定其它一切的话显然是不太合适的, 游戏最重要的是交互,一个高刷新率低交互率的游戏肯定让人受不了

?ρ? 我的??蛞仓皇 updateWorld 30次, updateDisplay 同??或更多, ?些知?都是?腻e?中?W?到的, 有?r候只需要知道答案的其中一部分, 其他部分能自己解?Q, 也是一??M足感.  [em16]

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2005-9-9 12:00:00 | 显示全部楼层

Re:D3d里面的刷新率,或者是fps.究竟该怎样理解?小弟实在

游戏速度不一,快的机器快,慢的机器慢,主要可能是按帧来走逻辑了
按时间来走逻辑而不是按帧来走逻辑,这样就可以避免不同机器游戏速度不一,只是显示上会和逻辑有可能脱节,但是不会造成不一。

方法是每帧的开头通过API算好上一帧到这一帧的时间,走逻辑的时候,把这个时间传入,比如走动,那么按帧的逻辑是
newpos = oldpos + speedvec;
按时间的逻辑就是
newpos = oldpos + speedvec* time;
这样,即便显示速度慢,也就是可能发生脱节,但不可能出现逻辑忽快忽慢。

其实调度器的原理就是这样,其他可以做的还有限帧(比如强制帧速为30FPS)、自动调度等等。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-16 13:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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