KTimer.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:4k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KTimer.cpp
  5. // Date: 2000.08.08
  6. // Code: WangWei(Daphnis)
  7. // Desc: Timer Class
  8. //---------------------------------------------------------------------------
  9. #include "KWin32.h"
  10. #include "KDebug.h"
  11. #include "KMemBase.h"
  12. #include "KTimer.h"
  13. // flying add this macro.
  14. // must pay more attention in the platform porting job.
  15. #ifdef __linux
  16. #include <sys/time.h>
  17. #endif
  18. KTimer::KTimer()
  19. {
  20. #ifdef WIN32
  21. m_nFrequency.QuadPart = 200 * 1024 * 1024;
  22. m_nTimeStart.QuadPart = 0;
  23. m_nTimeStop.QuadPart = 0;
  24. m_nFPS = 0;
  25. QueryPerformanceFrequency(&m_nFrequency);
  26. #else
  27.     //m_nFrequency = CLOCKS_PER_SEC;
  28. #endif
  29. }
  30. //---------------------------------------------------------------------------
  31. // 函数: Start
  32. // 功能: 开始计时
  33. // 参数: void
  34. // 返回: void
  35. //---------------------------------------------------------------------------
  36. void KTimer::Start()
  37. {
  38. #ifdef WIN32
  39. QueryPerformanceCounter(&m_nTimeStart);
  40. #else
  41.     gettimeofday(&m_nTimeStart, NULL);
  42. #endif
  43. }
  44. //---------------------------------------------------------------------------
  45. // 函数: Stop
  46. // 功能: 停止计时
  47. // 参数: void
  48. // 返回: void
  49. //---------------------------------------------------------------------------
  50. void KTimer::Stop()
  51. {
  52. #ifdef WIN32
  53. QueryPerformanceCounter(&m_nTimeStop);
  54. #else
  55. gettimeofday(&m_nTimeStop, NULL);
  56. #endif
  57. }
  58. //---------------------------------------------------------------------------
  59. // 函数: GetElapse
  60. // 功能: 计算从开始计时到现在已经过到时间
  61. // 参数: void
  62. // 返回: DWORD in ms
  63. //---------------------------------------------------------------------------
  64. DWORD KTimer::GetElapse()
  65. {
  66. #ifdef WIN32
  67. LARGE_INTEGER nTime;
  68. QueryPerformanceCounter(&nTime);
  69. return (DWORD)((nTime.QuadPart - m_nTimeStart.QuadPart) 
  70. * 1000 / m_nFrequency.QuadPart);
  71. #else
  72. timeval tv;
  73. gettimeofday(&tv, NULL);
  74.     return (tv.tv_sec - m_nTimeStart.tv_sec) * 1000 + tv.tv_usec / 1000;
  75. #endif
  76. }
  77. //---------------------------------------------------------------------------
  78. // 函数: GetElapseFrequency
  79. // 功能: 计算从开始计时到现在已经过到时间
  80. // 参数: void
  81. // 返回: DWORD in frequency
  82. //---------------------------------------------------------------------------
  83. DWORD KTimer::GetElapseFrequency()
  84. {
  85. #ifdef WIN32
  86. LARGE_INTEGER nTime;
  87. QueryPerformanceCounter(&nTime);
  88. return (DWORD)(nTime.QuadPart - m_nTimeStart.QuadPart);
  89. #endif
  90. return 0;
  91. }
  92. //---------------------------------------------------------------------------
  93. // 函数: GetInterval
  94. // 功能: 取得从开始到停止之间的时间间隔,以毫秒为单位
  95. // 参数: void
  96. // 返回: 毫秒值
  97. //---------------------------------------------------------------------------
  98. DWORD KTimer::GetInterval()
  99. {
  100. #ifdef WIN32
  101. return (DWORD)((m_nTimeStop.QuadPart - m_nTimeStart.QuadPart) 
  102. * 1000 / m_nFrequency.QuadPart);
  103. #endif
  104. return 0;
  105. }
  106. //---------------------------------------------------------------------------
  107. // 函数: Passed
  108. // 功能: 看是否过了nTime毫秒
  109. // 参数: nTime 毫秒
  110. // 返回: TRUE 已经过了
  111. // FALSE 还没有过
  112. //---------------------------------------------------------------------------
  113. BOOL KTimer::Passed(int nTime)
  114. {
  115. if (GetElapse() >= (DWORD)nTime)
  116. {
  117. Start();
  118. return TRUE;
  119. }
  120. return FALSE;
  121. }
  122. //---------------------------------------------------------------------------
  123. // 函数: GetFPS
  124. // 功能: 取得帧速率
  125. // 参数: nFPS 帧速率
  126. // 返回: TRUE 成功
  127. // FALSE 失败
  128. //---------------------------------------------------------------------------
  129. BOOL KTimer::GetFPS(int *nFPS)
  130. {
  131. if (GetElapse() >= 1000)
  132. {
  133. *nFPS = m_nFPS;
  134. m_nFPS = 0;
  135. Start();
  136. return TRUE;
  137. }
  138. m_nFPS++;
  139. return FALSE;
  140. }