#pragma once #pragma comment(lib, "winmm.lib") #include #include #include using namespace std; #define CPUMax 30000 #define CPUMin 10000 //FPS管理クラス class FPS{ public: //ループカウンタ,現在のフレーム,スリープ値,現在のフレームスキップ数,一秒おきのフレームスキップ数,一秒おきのループカウンタ,現在のFPS値 int LoopCount,Frame,sleep,Skip,FrameSkip,Fps,LoopMax,CurrentFps; bool draw; DWORD Time,Oldtime;//現在の時間,前回の時間 float FrameTime,FrameTimeO; FPS(int); void SetFPS(int); void GetFPS(); private: string str; char buf[255]; }; //コンストラクタ FPS::FPS(int fps){ draw=false; LoopCount=0; Frame=0; sleep=15; Skip=0; Fps=fps; FrameSkip=0; LoopMax=0; CurrentFps=0; FrameTime=1000.0f/fps-0.000001f;//1フレームの時間 FrameTimeO=1000.0f/fps+0.000001f; } void FPS::SetFPS(int fps){ Fps=fps; FrameTime=1000.0f/fps-0.000001f;//1フレームの時間 FrameTimeO=1000.0f/fps+0.000001f; } void FPS::GetFPS() { draw=false; LoopCount++; Time=timeGetTime(); if(Time-Oldtime>Frame*FrameTime){ Frame++; if(Time-Oldtime1)sleep--;//ウェイトを減らす Skip++; } } if(Time-Oldtime>1000-FrameTime){//一秒おきの処理 LoopMax=LoopCount; if(LoopMax>CPUMax){if(sleep<15)sleep++;}//十分に余力がある場合ウェイトを増やす if(LoopMax1)sleep--;}//余裕が無い場合ウェイトを減らす CurrentFps=Frame; FrameSkip=Skip; Skip=0; LoopCount=0; Frame=0; Oldtime=Time; } }