00001 00002 00003 00004 #include <assert.h> 00005 #include <windows.h> 00006 00007 //======================================================================== 00008 //内部変数 00009 //======================================================================== 00010 static DWORD beforTime; 00011 static DWORD nowTime; 00012 static DWORD waitLimitTime = 1000 / 60; 00013 static DWORD dispStartTime; 00014 static DWORD nowFpsValue; 00015 00016 00017 //======================================================================== 00018 //外部公開関数 00019 //======================================================================== 00020 void SetFpsValue(DWORD value); 00021 void SetBeforTime(); 00022 void SetNowTime(); 00023 BOOL GetElapsedTime(DWORD *waitTime); 00024 BOOL GetNowFPSValue(DWORD *fpsValue); 00025 00026 //======================================================================== 00031 //======================================================================== 00032 void SetFpsValue(DWORD value) 00033 { 00034 waitLimitTime = 1000 / value; //value=60の場合、1フレームは最大16秒Sleep()させる 00035 } 00036 00037 //======================================================================== 00041 //======================================================================== 00042 void SetBeforTime() 00043 { 00044 beforTime = timeGetTime(); 00045 } 00046 00047 //======================================================================== 00051 //======================================================================== 00052 void SetNowTime() 00053 { 00054 nowTime = timeGetTime(); 00055 } 00056 00057 //======================================================================== 00064 //======================================================================== 00065 BOOL GetElapsedTime(DWORD *waitTime) 00066 { 00067 DWORD elapsedTime; //処理時間 00068 00069 //引数にNULLが入っていたらとめる 00070 assert(waitTime != NULL); 00071 00072 //1フレームの処理時間を求める 00073 elapsedTime = nowTime - beforTime; 00074 if(elapsedTime < waitLimitTime) 00075 { 00076 //Sleepする時間より速く処理が終わった場合 00077 *waitTime = waitLimitTime - elapsedTime; //Sleepする時間を返す 00078 return TRUE; 00079 } 00080 else 00081 { 00082 //Sleepする時間を過ぎてしまった場合 00083 *waitTime = elapsedTime - waitLimitTime; //過ぎた時間を入れる(計測用ぐらいしか使い道がないかな) 00084 return FALSE; 00085 } 00086 } 00087 00088 //======================================================================== 00094 //======================================================================== 00095 BOOL GetNowFPSValue(DWORD *fpsValue) 00096 { 00097 //フレームをカウントする 00098 nowFpsValue++; 00099 if(nowTime - dispStartTime > 1000) 00100 { 00101 //引数にNULLが入っていたらとめる 00102 assert(fpsValue != NULL); 00103 00104 //計測開始時間を今の時間に 00105 dispStartTime = nowTime; 00106 //戻り値用引数へFPS値を格納 00107 *fpsValue = nowFpsValue; 00108 //FPSカウントを0にする 00109 nowFpsValue = 0; 00110 return TRUE; 00111 } 00112 00113 return FALSE; 00114 } 00115