cocos2d-x 帧刷新 所用的计时:
设置FPS的函数:
//外部调用的设置帧间隔时间
void CCApplication::setAnimationInterval(double interval)
{
//获取高精度定时器的频率
LARGE_INTEGER nFreq;
QueryPerformanceFrequency(&nFreq);
//计算出频率X帧间隔时差的值存入m_nAnimationInterval用做比较值
m_nAnimationInterval.QuadPart = (LONGLONG)(interval * nFreq.QuadPart);
}
同时, int CCApplication::run() 函数里面的 处理消息循环:
//非常熟悉!进入WINDOWS消息循环
while (1)
{
//如果没有获取到WINDOWS消息
if (! PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
// 取得当前的计数值,即频率x当前时间
QueryPerformanceCounter(&nNow);
//m_nAnimationInterval.QuadPart的值 为setAnimationInterval函数进行设置的固定值。此处是为了判断时间流逝了多久,是否应该更新显示设备
if (nNow.QuadPart - nLast.QuadPart > m_nAnimationInterval.QuadPart)
{
//如果时间流逝达到了设定的FPS时间差,则更新计数值。
nLast.QuadPart = nNow.QuadPart;
//这里是设备渲染场景的函数
CCDirector::sharedDirector()->mainLoop();
}
else
{
//sleep0秒的意义是让CPU做下时间片切换,防止死循环而使系统其它程序得不到响应。
Sleep(0);
}
continue;
}
//有消息获取到
if (WM_QUIT == msg.message)
{
// 如果获取的消息是退出则退出循环。
break;
}
// 如果没有定义加速键或者处理完加速键信息
if (! m_hAccelTable || ! TranslateAccelerator(msg.hwnd, m_hAccelTable, &msg))
{
//处理Windows消息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
从而引出:高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter()
QueryPerformanceFrequency() :
类型:Win32API
原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
作用:返回硬件支持的高精度计数器的频率。
返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。
QueryPerformanceCounter():
LARGE_INTEGER *lpPerformanceCount // address of current counter value 当前计数器值的地址
);
lpPerformanceCount是返回定时器当前计数值。
示例:
计算程序执行时间
/
#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
_LARGE_INTEGER time_start; /*开始时间*/
_LARGE_INTEGER time_over; /*结束时间*/
double dqFreq; /*计时器频率*/
LARGE_INTEGER f; /*计时器频率*/
QueryPerformanceFrequency(&f);
dqFreq=(double)f.QuadPart;
QueryPerformanceCounter(&time_start);
Sleep(1000);/*循环耗时*/
QueryPerformanceCounter(&time_over);
cout<<((time_over.QuadPart-time_start.QuadPart)/dqFreq)<<endl;//单位为秒,精度为1000 000/(cpu主频)微秒
}