llframetimer.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llframetimer.cpp
  3.  *
  4.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2002-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #include "linden_common.h"
  32. #include "u64.h"
  33. #include "llframetimer.h"
  34. // Static members
  35. //LLTimer LLFrameTimer::sInternalTimer;
  36. U64 LLFrameTimer::sStartTotalTime = totalTime();
  37. F64 LLFrameTimer::sFrameTime = 0.0;
  38. U64 LLFrameTimer::sTotalTime = 0;
  39. F64 LLFrameTimer::sTotalSeconds = 0.0;
  40. S32 LLFrameTimer::sFrameCount = 0;
  41. U64 LLFrameTimer::sFrameDeltaTime = 0;
  42. const F64 USEC_PER_SECOND = 1000000.0;
  43. const F64 USEC_TO_SEC_F64 = 0.000001;
  44. // static
  45. void LLFrameTimer::updateFrameTime()
  46. {
  47. U64 total_time = totalTime();
  48. sFrameDeltaTime = total_time - sTotalTime;
  49. sTotalTime = total_time;
  50. sTotalSeconds = U64_to_F64(sTotalTime) * USEC_TO_SEC_F64;
  51. sFrameTime = U64_to_F64(sTotalTime - sStartTotalTime) * USEC_TO_SEC_F64;
  52. void LLFrameTimer::start()
  53. {
  54. reset();
  55. mStarted = TRUE;
  56. }
  57. void LLFrameTimer::stop()
  58. {
  59. mStarted = FALSE;
  60. }
  61. void LLFrameTimer::reset()
  62. {
  63. mStartTime = sFrameTime;
  64. mExpiry = sFrameTime;
  65. }
  66. void LLFrameTimer::resetWithExpiry(F32 expiration)
  67. {
  68. reset();
  69. setTimerExpirySec(expiration);
  70. }
  71. // Don't combine pause/unpause with start/stop
  72. // Useage:
  73. //  LLFrameTime foo; // starts automatically
  74. //  foo.unpause(); // noop but safe
  75. //  foo.pause(); // pauses timer
  76. //  foo.unpause() // unpauses
  77. //  F32 elapsed = foo.getElapsedTimeF32() // does not include time between pause() and unpause()
  78. //  Note: elapsed would also be valid with no unpause() call (= time run until pause() called)
  79. void LLFrameTimer::pause()
  80. {
  81. if (mStarted)
  82. mStartTime = sFrameTime - mStartTime; // save dtime
  83. mStarted = FALSE;
  84. }
  85. void LLFrameTimer::unpause()
  86. {
  87. if (!mStarted)
  88. mStartTime = sFrameTime - mStartTime; // restore dtime
  89. mStarted = TRUE;
  90. }
  91. void LLFrameTimer::setTimerExpirySec(F32 expiration)
  92. {
  93. mExpiry = expiration + mStartTime;
  94. }
  95. void LLFrameTimer::setExpiryAt(F64 seconds_since_epoch)
  96. {
  97. mStartTime = sFrameTime;
  98. mExpiry = seconds_since_epoch - (USEC_TO_SEC_F64 * sStartTotalTime);
  99. }
  100. F64 LLFrameTimer::expiresAt() const
  101. {
  102. F64 expires_at = U64_to_F64(sStartTotalTime) * USEC_TO_SEC_F64;
  103. expires_at += mExpiry;
  104. return expires_at;
  105. }
  106. BOOL LLFrameTimer::checkExpirationAndReset(F32 expiration)
  107. {
  108. //llinfos << "LLFrameTimer::checkExpirationAndReset()" << llendl;
  109. //llinfos << "  mStartTime:" << mStartTime << llendl;
  110. //llinfos << "  sFrameTime:" << sFrameTime << llendl;
  111. //llinfos << "  mExpiry:   " <<  mExpiry << llendl;
  112. if(hasExpired())
  113. {
  114. reset();
  115. setTimerExpirySec(expiration);
  116. return TRUE;
  117. }
  118. return FALSE;
  119. }
  120. // static
  121. F32 LLFrameTimer::getFrameDeltaTimeF32()
  122. {
  123. return (F32)(U64_to_F64(sFrameDeltaTime) * USEC_TO_SEC_F64); 
  124. }
  125. // static 
  126. // Return seconds since the current frame started
  127. F32  LLFrameTimer::getCurrentFrameTime()
  128. {
  129. U64 frame_time = totalTime() - sTotalTime;
  130. return (F32)(U64_to_F64(frame_time) * USEC_TO_SEC_F64); 
  131. }
  132. // Glue code to avoid full class .h file #includes
  133. F32  getCurrentFrameTime()
  134. {
  135. return (F32)(LLFrameTimer::getCurrentFrameTime());
  136. }