一个可以精确控制FPS的程序框架
2010-11-08 09:51
302 查看
经常看到有人讨论如何在主循环中控制帧速的问题,很多人使用Sleep之类的函数,其实Sleep本身虽然能释放CPU,但无法做到精确控制FPS的值,这里介绍一种比较巧妙的框架,对FPS可以做到比较精确的控制,而且也不会占用CPU。
这个框架用到了两个比较关键的函数:
timeSetEvent
,调用这个函数后,操作系统创建了一个后台线程,这个线程由winmm.dll控制,按照指定的频率执行指定某函数或者将某个信号设置为“有信号”。
MsgWaitForMultipleObjects
,这个函数和WaitForMultipleObjects相比,除了等待多个信号外,同时还可以同时等待指定的窗口消息。
这个框架的原理就是首先创建一个Event作为渲染信号,并且用timeSetEvent函数按照帧速频率控制它变为“有信号”
// Create render signal event
HANDLE
g_hTickEvent
= ::
CreateEvent
(
NULL
,
FALSE
,
FALSE
,
NULL
)
;
ResetEvent
(
g_hTickEvent
)
;
// Create time event
MMRESULT
g_hEventTimer
= ::
timeSetEvent
(
(
INT
)(
1000.0
f
/
MAX_FPS
)
,
1
,
(
LPTIMECALLBACK
)
g_hTickEvent
,
0
,
TIME_PERIODIC
|
TIME_CALLBACK_EVENT_SET
)
;
在主循环中,使用MsgWaitForMultipleObjects释放CPU,如果等待的结果是渲染信号,则进入渲染函数,如果是窗口消息,则进入消息处理函数
MSG
msg
;
ZeroMemory
(
&
msg
,
sizeof
(
msg
)
)
;
while
(
msg
.
message
!=
WM_QUIT
)
{
if
(
WAIT_OBJECT_0
==
MsgWaitForMultipleObjects
(
1
, &
g_hTickEvent
,
FALSE
,
1000
,
QS_ALLINPUT
))
{
Render
()
;
}
else
{
while
(
PeekMessage
(
&
msg
,
NULL
,
0
,
0
,
PM_REMOVE
))
{
if
(
msg
.
message
==
WM_QUIT
)
break
;
TranslateMessage
(
&
msg
)
;
DispatchMessage
(
&
msg
)
;
}
;
}
}
源代码下载: fpsFrame.rar
(5.6k)
这个框架用到了两个比较关键的函数:
timeSetEvent
,调用这个函数后,操作系统创建了一个后台线程,这个线程由winmm.dll控制,按照指定的频率执行指定某函数或者将某个信号设置为“有信号”。
MsgWaitForMultipleObjects
,这个函数和WaitForMultipleObjects相比,除了等待多个信号外,同时还可以同时等待指定的窗口消息。
这个框架的原理就是首先创建一个Event作为渲染信号,并且用timeSetEvent函数按照帧速频率控制它变为“有信号”
// Create render signal event
HANDLE
g_hTickEvent
= ::
CreateEvent
(
NULL
,
FALSE
,
FALSE
,
NULL
)
;
ResetEvent
(
g_hTickEvent
)
;
// Create time event
MMRESULT
g_hEventTimer
= ::
timeSetEvent
(
(
INT
)(
1000.0
f
/
MAX_FPS
)
,
1
,
(
LPTIMECALLBACK
)
g_hTickEvent
,
0
,
TIME_PERIODIC
|
TIME_CALLBACK_EVENT_SET
)
;
在主循环中,使用MsgWaitForMultipleObjects释放CPU,如果等待的结果是渲染信号,则进入渲染函数,如果是窗口消息,则进入消息处理函数
MSG
msg
;
ZeroMemory
(
&
msg
,
sizeof
(
msg
)
)
;
while
(
msg
.
message
!=
WM_QUIT
)
{
if
(
WAIT_OBJECT_0
==
MsgWaitForMultipleObjects
(
1
, &
g_hTickEvent
,
FALSE
,
1000
,
QS_ALLINPUT
))
{
Render
()
;
}
else
{
while
(
PeekMessage
(
&
msg
,
NULL
,
0
,
0
,
PM_REMOVE
))
{
if
(
msg
.
message
==
WM_QUIT
)
break
;
TranslateMessage
(
&
msg
)
;
DispatchMessage
(
&
msg
)
;
}
;
}
}
源代码下载: fpsFrame.rar
(5.6k)
相关文章推荐
- 一个可以精确控制FPS的程序框架
- 精确控制FPS的程序框架
- 关于精确控制FPS的程序框架
- Android中Activity启动模式详解,可以控制程序按home键后进来还会调用一个自己不喜欢的界面
- 关于一个程序中多个Notification的精确控制
- 分享一个可以灵活控制的实现Javascript滚动效果的程序
- 创建一个程序读入和显示视频文件,并可以使用滑动条控制视频文件的播放。一个滑动条用来控制视频播放位置,以10为步长跳进。另一个滑动条用来控制停止/播放
- 单片机控制继电器电路 程序就很简单了 做一个口的输出就可以了
- 用程序动态控制只有一个或少数几个字段可以改
- www.codeproject.com上一个控制Windows服务的程序,用C#写服务控制程序时可以参考!
- 制作一个控制台小程序,要求:用户可以在控制到录入学生的姓名,当用户输入quit(不区分大小写)时,程序停止接收用户输入,并且显示出学生个数及姓名
- Android中Activity启动模式详解,可以控制程序按home键后进来还会调用一个自己不喜欢的界面
- Qt是一个不错的库。因此在一些场合下,可以基于Qt搭建程序和游戏框架。
- 微信小程序框架wepy之动态控制类名
- 一个养狗场有4只狗,体重分别为 花花:4.5kg;白白:5.6kg;黑黑:78kg;红红:9.0kg;请编写一个程序,可以计算他们的平均体重,可以找出体重最大和体重最小的狗的名字.
- 怎样从0开始搭建一个既可以功能测试+又可以接口测试框架(灰蓝作品,qq号:396214358 )
- 闲的无聊可以运行这个Java程序,添加或减少一个nest loop试一试
- 编写一个程序,可以通过次程序完成一个表的创建操作,输入表的名称,各个列的名称及类型,输入完成后直接通过JDBC创建指定的表。
- SpringMvc一个简单的框架入门程序
- Factory 定义一个接口,客户可以使用这个接口创建一个对象.同时,我们还可以控制对那个类进行实例化