一个可以精确控制FPS的程序框架
来源:互联网 发布:淘宝直通车怎么搜宝贝 编辑:程序博客网 时间:2024/04/29 07:07
经常看到有人讨论如何在主循环中控制帧速的问题,很多人使用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.0f/MAX_FPS),
1,
(LPTIMECALLBACK)g_hTickEvent,
0,
TIME_PERIODIC|TIME_CALLBACK_EVENT_SET);
HANDLE g_hTickEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
ResetEvent(g_hTickEvent);
// Create time event
MMRESULT g_hEventTimer = ::timeSetEvent(
(INT)(1000.0f/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);
};
}
}
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的程序框架
- 精确控制FPS的程序框架
- 如何精确的控制FPS
- 如何精确的控制FPS
- 精确控制游戏的fps
- 如何精确控制FPS
- 精确FPS
- 精确FPS
- C语言基础--测试程序中实现对FPS的控制
- UE4制作一个可以控制的小球
- 一个比较精确计算cpu主频的程序
- CCS中使用DSP定时器的计时程序,可以精确计算某一段程序的执行时间
- 一个精确的定时器
- 关于循环的精确控制
- 精确控制div的高度
- FPS跳跃控制
- 关于linux图形界面的基本知识
- ubuntu下安装linxu版本的飞信
- 嵌入式的C单元测试工具集18个
- IE6 IE5.5 DIV height 小于20px不起作用
- 投资赚钱新方法
- 一个可以精确控制FPS的程序框架
- Oracle Sql优化笔记
- 如何调整对话框的字体大小
- Linux kmalloc
- 闲来无事
- How SKBs work
- Conversion Between Unicode-UCS-4 And UTF-8 (Unicode-UCS-4 与 UTF-8 之间的转换)
- Flex编程学习基础
- STL 神奇的__type_traits (转