[win32] timeGetTime,GetTickCount在多核CPU上时间倒流
2016-07-08 13:13
501 查看
游戏渲染循环中,每次都要用timeGetTime或者GetTickCount,来取得时间,作为deltaTime。但是发现在Win7上,有时候取到的是负数。这是多核CPU导致的问题。
大致有三种方案:
1. 判断deltaTime,如果小于等于0,那么忽略这次更新。SM里面用的就是这个方案。
2. 使用SetThreadAffinityMask将线程绑定到一个指定的CPU核上,但是SM里面说XP下,会导致帧率下降10%。
3. 在取时间前后加上timeBeginPeriod(1);和timeEndPeriod(1);
这个方法是设置最大的时间精度,但是msdn上说,这个值是整个windows共用的值,如果设的精度比较高,那么线程之间切换回比较频繁,可能会让电脑进入不了power-saving modes。这个方法试了,可以解决问题,但是msdn上说的顾虑,这些没考虑过。
综合来看,还就是最简单的方法1最省心。
代码示例,用了龙书里面的代码:
大致有三种方案:
1. 判断deltaTime,如果小于等于0,那么忽略这次更新。SM里面用的就是这个方案。
2. 使用SetThreadAffinityMask将线程绑定到一个指定的CPU核上,但是SM里面说XP下,会导致帧率下降10%。
3. 在取时间前后加上timeBeginPeriod(1);和timeEndPeriod(1);
这个方法是设置最大的时间精度,但是msdn上说,这个值是整个windows共用的值,如果设的精度比较高,那么线程之间切换回比较频繁,可能会让电脑进入不了power-saving modes。这个方法试了,可以解决问题,但是msdn上说的顾虑,这些没考虑过。
综合来看,还就是最简单的方法1最省心。
代码示例,用了龙书里面的代码:
int d3d::EnterMsgLoop( bool (*ptr_display)(float timeDelta) ) { MSG msg; ::ZeroMemory(&msg, sizeof(MSG)); static float lastTime = (float)timeGetTime(); while(msg.message != WM_QUIT) { if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } else { // 通过timeBeginPeriod和timeEndPeriod解决时光倒流 // timeBeginPeriod(1); // float currTime = (float)timeGetTime(); // timeEndPeriod(1); // float timeDelta = (currTime - lastTime)*0.001f; // // ptr_display(timeDelta); // lastTime = currTime; // 通过忽略负数,解决时光倒流 float currTime = (float)timeGetTime(); float timeDelta = (currTime - lastTime)*0.001f; if(timeDelta > 0) { ptr_display(timeDelta); lastTime = currTime; } else { ; // do nothing } } } return msg.wParam; }
相关文章推荐
- 如何重装TCP/IP协议
- Windows 8 官方高清壁纸欣赏与下载
- 谁是桌面王者?Win PK Linux三大镇山之宝
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows Clang开发环境备忘
- 从Windows系统下访问Linux分区相关软件
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows下搭建本地SVN服务器
- 使用Windows原生命令一键清空剪贴板
- windows用windeployqt发布qt quick application程序
- 利用开源软件打造自己的全功能远程工具
- Windows 8虚拟机不能全屏的解决方法
- 虚拟化基础架构Windows 2008篇之1-虚拟化基础服务概述
- 虚拟化基础架构Windows 2008篇之5-安装Windows部署服务
- 虚拟化基础架构Windows 2008篇之7-添加其他操作系统的安装镜像
- 虚拟化基础架构Windows 2008篇之9-配置Windows部署服务
- 虚拟化基础架构Windows 2008篇之12-WSUS工作站端配置
- Visual Studio 2012 示例代码浏览器 - 数以千计的开发示例近在手边,唾手可得