精确控制FPS的程序框架
2011-11-29 14:40
204 查看
经常看到有人讨论如何在主循环中控制帧速的问题,很多人使用Sleep之类的函数,其实Sleep本身虽然能释放CPU,但无法做到精确控制FPS的值,这里介绍一种比较巧妙的框架,对FPS可以做到比较精确的控制,而且也不会占用CPU。
这个框架用到了两个比较关键的函数:
timeSetEvent,调用这个函数后,操作系统创建了一个后台线程,这个线程由winmm.dll控制,按照指定的频率执行指定某函数或者将某个信号设置为“有信号”。
MsgWaitForMultipleObjects,这个函数和WaitForMultipleObjects相比,除了等待多个信号外,同时还可以同时等待指定的窗口消息。
这个框架的原理就是首先创建一个Event作为渲染信号,并且用timeSetEvent函数按照帧速频率控制它变为“有信号”
在主循环中,使用MsgWaitForMultipleObjects释放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);
在主循环中,使用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); }; } }
相关文章推荐
- 一个可以精确控制FPS的程序框架
- 一个可以精确控制FPS的程序框架
- 关于精确控制FPS的程序框架
- 微信小程序框架wepy之动态控制类名
- 如何精确的控制FPS
- 关于一个程序中多个Notification的精确控制
- 微信小程序框架wepy之动态控制类名
- 如何精确的控制FPS
- 如何精确控制FPS
- 精确控制游戏的fps
- C语言基础--测试程序中实现对FPS的控制
- 蜘蛛/爬虫程序的多线程控制(C#语言) [转]
- 十大免费移动程序测试框架(Android/iOS)
- MFC单文档程序中搭建OpenGL框架
- [置顶] 单片机串口通信原理和控制程序
- 第一个JAVA小程序的程序框架
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 10.宿主程序详细设计
- OSG+CEGUI程序框架OpenSceneGraph-2.8.2+CEGUI-0.6.2-vc9
- 由于没有安装音量控制程序,WINDOWS无法在任务栏上显示音量控制,怎么解决?
- 使用汇编语言编写程序,设计一个用8051单片机控制的循环彩灯控制系统