FPS
Posted: 2012年10月29日(月) 20:31
関数内で任意のFPS(60fps)にしたいんですが、int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){} 内では任意のFPSで動作するんですが、通常の関数内ではFPSが47fpsなどになったりします。どのような対処をすればよいのでしょうか?
>SetGraphMode()は始めに一度だけ読み込んで使用しているのですが、FPSが設定値より小さくなります。SOJO さんが書きました:>涼雅さん
SetGraphMode()は始めに一度だけ読み込んで使用しているのですが、FPSが設定値より小さくなります。
>softya(ソフト屋) さん
現在のプログラムだけで重い状況なので、できれば軽い処理でウィンドウを大きくしたいのですが、他に方法はないのでしょうか?身勝手で申し訳ないです。
それだけでは描画が遅いのかCPUが遅いのか判別ができません。SOJO さんが書きました:>softya(ソフト屋)
他の処理をコメントアウトしてSetGraphMode()のあるなしで検証を行ったところ、SetGraphMode()があるときにFPSが減りました。関数の引数としては
SetGraphMode(850, 650, 32);
で使用しています。多分、どこかのサイトに乗っていたのをコピーしてきたものだと思います。あと、ウィンドウのサイズはもっと大きくしたいと考えています。
softya(ソフト屋) さんが書きました:SOJO さんが書きました:>softya(ソフト屋)
それだけでは描画が遅いのかCPUが遅いのか判別ができません。
両者は同時並行で動作するためちゃんと計測しないとどちらが原因かを判別できませんので必ず計測してください。
それと、860,650は凄く特殊な解像度だと思います。
実はSetGraphMode(800, 600, 32);としたら普通に動きませんか?(画面内の物体の位置は気にしないとして)
#include "Dxlib.h"
static int mStartTime; //測定開始時刻
static int mCount; //カウンタ
static float mFps; //fps
static const int N = 60; //平均を取るサンプル数
static const int FPS = 60; //設定したFPS
bool Update()
{
if( mCount == 0 ) { //1フレーム目なら時刻を記憶
mStartTime = GetNowCount();
}
if( mCount == N ) { //60フレーム目なら平均を計算する
int t = GetNowCount();
mFps = 1000.f / ( ( t - mStartTime ) / ( float )N );
mCount = 0;
mStartTime = t;
}
mCount++;
return true;
}
void Draw()
{
DrawFormatString( 0, 0, GetColor( 255, 255, 255 ), "%.1f", mFps );
}
void Wait()
{
int tookTime = GetNowCount() - mStartTime; //かかった時間
int waitTime = mCount * 1000 / FPS - tookTime; //待つべき時間
if( waitTime > 0 ) {
Sleep( waitTime ); //待機
}
}
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
SetGraphMode( 800, 600, 32 );
SetDrawScreen( DX_SCREEN_BACK ); //再設定。
while( ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {
Update(); //更新
Draw(); //描画
ScreenFlip();
Wait();
}
}