游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6194|回复: 14

如何控制帧率?

[复制链接]

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2011-4-25 17:02:00 | 显示全部楼层 |阅读模式
有A和B两台PC
A开启了垂直同步,帧率恒定为60fps。
B没开启垂直同步。

如何写出代码,让游戏在A上以60fps正常运行,在B上以100fps正常运行?

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2011-4-30 18:17:00 | 显示全部楼层

Re:如何控制帧率?

1:开不开垂直同步应该是D3D初始化决定的吧?而且一般都在60FPS吧?
2:我只知道用Sleep()控制,另外,不开垂直同步画面会有撕裂感,3D倒没啥,2D就不行了。
说的不对,还请指出..

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2011-4-30 20:42:00 | 显示全部楼层

Re:如何控制帧率?

用Sleep()控制?
控制为多少秒呢? 1/100秒 还是 1/60秒?
这才是问题的关键。因为两台机器的刷新频率不一样。
如何让同一个代码在不同刷新率的PC上各自以正常刷新率运行。

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2011-4-30 20:57:00 | 显示全部楼层

Re: Re:如何控制帧率?

snhun: Re:如何控制帧率?

用Sleep()控制?
控制为多少秒呢? 1/100秒 还是 1/60秒?
这才是问题的关键。因为两台机器的刷新频率不一样。
如何让同一个代码在不同刷新率的PC上各自以正常刷新率运行。


想控制多少秒就控制多少秒,跟显示器无关:


  1. void CGameApp::Run()
  2. {
  3.         MSG msg;
  4.         ZeroMemory(&msg, sizeof(msg));

  5.         int constFps = 40;
  6.         float timeInOneFps = 1000.0f/constFps;        // 每秒60帧,则1帧就是约16毫秒
  7.         DWORD timeBegin;
  8.         DWORD timeTotal;

  9.         while (msg.message != WM_QUIT)
  10.         {
  11.                 if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
  12.                 {
  13.                         TranslateMessage(&msg);
  14.                         DispatchMessage(&msg);
  15.                 }

  16.                 timeBegin = timeGetTime();

  17.                 // 执行游戏逻辑部分
  18.                 g_pInput->UpdateBufferInput(&g_stInputInfo);
  19.                 MainLoop();
  20.                
  21.                 timeTotal = timeGetTime()-timeBegin;

  22.                 if (timeTotal < timeInOneFps)
  23.                 {
  24.                         float timeSleep = timeInOneFps-timeTotal;
  25.                         Sleep(DWORD(timeSleep));
  26.                 }
  27.         }
  28. }
复制代码


就是让他一帧只能执行多少毫秒,是控制时间的.

另外:
1:我并不能保证我的这个方案是对的,或者说是你所需要的.
2:一般开了垂直同步,应该每个机器都是相同的,因为是按时间的,不是按执行速度,如果我理解有偏差的话,那我就想不到是什么情况了。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2011-4-30 21:01:00 | 显示全部楼层

Re:如何控制帧率?

你把时间间隔控制为 1/100秒,然后在开启了垂直同步的PC上运行一下看看吧。
操作会有半秒钟的延迟。也就是“不正常”。

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2011-4-30 22:39:00 | 显示全部楼层

Re: Re:如何控制帧率?

snhun: Re:如何控制帧率?

你把时间间隔控制为 1/100秒,然后在开启了垂直同步的PC上运行一下看看吧。
操作会有半秒钟的延迟。也就是“不正常”。


开启了垂直同步就不能自己控制帧率了,可以自己控制一下,在这两者之间任意切换

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2011-4-30 23:49:00 | 显示全部楼层

Re:如何控制帧率?

一个程序,它不知道自己运行在多少帧数的PC上。
也许这台PC是60帧,开启垂直同步的。也许是没有开启垂直同步的。

怎么个“自己控制一下”?

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2011-5-1 00:27:00 | 显示全部楼层

Re: Re:如何控制帧率?

snhun: Re:如何控制帧率?

一个程序,它不知道自己运行在多少帧数的PC上。
也许这台PC是60帧,开启垂直同步的。也许是没有开启垂直同步的。

怎么个“自己控制一下”?


说真的,我一直以为D3DPRESENT_INTERVAL_ONE就是垂直同步,但仔细想来,又不敢确定,我就知道使用D3DPRESENT_INTERVAL_ONE可以使画面很平滑,使帧率稳定,每台机器都一样,我一直这么做.
而且据说D3DPRESENT_INTERVAL_ONE几乎所有硬件都支持.

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2011-5-3 11:48:00 | 显示全部楼层

Re:如何控制帧率?

游戏逻辑是按照时间走的,不是根据帧率走的...

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
 楼主| 发表于 2011-5-3 11:58:00 | 显示全部楼层

Re: Re:如何控制帧率?

artint: Re:如何控制帧率?

游戏逻辑是按照时间走的,不是根据帧率走的...

游戏逻辑是100次/秒
开启垂直同步,画面刷新率恒定在60Hz

你每秒发100张画面,让60Hz的显卡去渲染,它能正常渲染?
才怪呢。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 05:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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