标签:void font 锻炼 开头 count 一点 double 着色器 世界
百度了,狗狗了,必应了,然而,并没有什么卵用.
扭头问老大,老大一声令下:不许问别人,这个问题单独解决,顺便提交个解决方式我.
真羡慕你们的好记性...
羡慕虽好,然而,并没有什么卵用.还得靠自己多锻炼.
对,我近期是加入了着色器程序,那我执行没有着色器的程序试试看
void Application::Run() { MSG msg; static float lastTime = (float)timeGetTime();//上一次的时间 ZeroMemory(&msg, sizeof(MSG)); while (msg.message != WM_QUIT) { if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { float currTime = (float)timeGetTime();//当前的时间 float timedelta = (currTime - lastTime)*0.001f; //时间间隔 //世界更新 m_GameWorld->Update((float)timedelta); //更新fps UpdateFPS(); //画一帧 DrawOneFrame(); lastTime = currTime; } } }
ok,配置完成,赶紧看下输出数据吧:
结果:
一大堆的0.000000,然后突然0.128000
结论:罪魁祸首原来在这里,这就是导致不孕不...不是,呸,导致画面不平滑,一愣一愣的根本原因.
更新,渲染,一圈下来时间竟然为0?
怎么可能...
所以寻找高精度的计时函数QueryPerformanceFrequency()和QueryPerformanceCounter()
这两函数牛逼啊,根硬件时钟的晶振是一个级别的,资料上说,精确到了千分之中的一个毫秒,也就是微秒级别的...
好啊,要的就是你啊....
下面便是改动的消息循环run的代码:
void Application::Run() { MSG msg; LARGE_INTEGER nFreq; LARGE_INTEGER nBeginTime, nEndTime; QueryPerformanceFrequency(&nFreq);//获得时钟频率 QueryPerformanceCounter(&nBeginTime);//開始的时间 ZeroMemory(&msg, sizeof(MSG)); while (msg.message != WM_QUIT) { if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { QueryPerformanceCounter(&nEndTime);//结束的时间 float timedelta = (float)(nEndTime.QuadPart - nBeginTime.QuadPart) / (float)nFreq.QuadPart; _cprintf("timedelta = %f\n", timedelta);//控制台输出结果 //世界更新 m_GameWorld->Update((float)timedelta); //d3d设备指针一个项目里仅仅能有唯一一个 UpdateFPS(); //画一帧 DrawOneFrame(); nBeginTime = nEndTime; } } }结果:
唉,整个人心情都好了,摄像机移动,画面流畅得一笔啊...
标签:void font 锻炼 开头 count 一点 double 着色器 世界
原文地址:http://www.cnblogs.com/cynchanpin/p/6782506.html