• 在写游戏时钟类时,应确保时钟的计算是以某个固定的CPU为标准的


    在写游戏时钟类时,应确保时钟的计算是以某个固定的CPU为标准的。下面通过一个例子来阐述如何实现这一思想:

    	// 记录特定进程的affinity mask
    	unsigned long lProcessAffinityMask;
    	// 记录系统的affinity mask
    	unsigned long lSystemAffinityMask;
    	::GetProcessAffinityMask(::GetCurrentProcess(), &lProcessAffinityMask, &lSystemAffinityMask);
    
    	// 将指定线程(此处以当前线程为例)限定在第1个CPU上执行
    	::SetThreadAffinityMask(::GetCurrentThread(), 1);
    
    	// 获取当前CPU(第1个CPU)每秒tick的次数
    	LARGE_INTEGER lpFrequency;
    	::QueryPerformanceFrequency(&lpFrequency);
    
    	// 获取程序执行到现在的时间
    	LARGE_INTEGER lpCountStart;
    	::QueryPerformanceCounter(&lpCountStart);
    
    	// 将指定线程限定在任意CPU(GetProcessAffinityMask返回的CPU mash集)上执行
    	::SetThreadAffinityMask(::GetCurrentThread(), lProcessAffinityMask);
    
    	// do something...
    
    	::SetThreadAffinityMask(::GetCurrentThread(), 1);
    	// 获取程序执行到现在的时间
    	LARGE_INTEGER lpCountEnd;
    	::QueryPerformanceCounter(&lpCountEnd);
    	::SetThreadAffinityMask(::GetCurrentThread(), lProcessAffinityMask);
    
    	int timeElasped=( ((lpCountEnd.QuadPart - lpCountStart.QuadPart) * 1000)/lpFrequency.QuadPart);
    
    	cout<<timeElasped<<endl;

    我们可以看到,获取CPU时钟相关的代码段都被指定在了是在CPU0(即第1个CPU)上执行的(代码段的线程被指定在第1个CPU),这就确保了时钟的统一性。

  • 相关阅读:
    sed 删除最后几行 和删除指定行 awk使用
    nagios监控
    nginx服务启动脚本
    Linux修改环境变量的4种方法
    源码编译apache报错的解决方法
    apache源码安装及启动脚本添加
    haproxy配置
    awk命令2
    awk命令1
    通配符及变量
  • 原文地址:https://www.cnblogs.com/sifenkesi/p/2065967.html
Copyright © 2020-2023  润新知