FPS

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
SOJO

FPS

#1

投稿記事 by SOJO » 12年前

 関数内で任意のFPS(60fps)にしたいんですが、int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){} 内では任意のFPSで動作するんですが、通常の関数内ではFPSが47fpsなどになったりします。どのような対処をすればよいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: FPS

#2

投稿記事 by softya(ソフト屋) » 12年前

それだけの情報では勘でしか答えらません。出来ればソースコードを載せてください。
勘で答えると関数内で画像をロードしている可能性があると思います。

それと、つぎの4つの問題に該当してませんか?
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SOJO

Re: FPS

#3

投稿記事 by SOJO » 12年前

 原因のようなものを発見しました。SetGraphMode()という関数をウィンドウを大きくするために使用しているのですが、これの影響でFPSが小さくなるようです。しかし、この関数をコメントアウトしてしまうと画像が表示されなくなります。なぜSetGraphMode()はFPSに影響するのでしょうか?
 また、申し訳ありませんが、ソースがとても長く掲載することができません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: FPS

#4

投稿記事 by softya(ソフト屋) » 12年前

SetGraphModeは大変重い処理です。毎回呼んでいたら重くなると思います。
あとモニターのドット数と画面解像度が違うと大変画像が汚く見える場合があるので出来れば止めたほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SOJO

Re: FPS

#5

投稿記事 by SOJO » 12年前

 では、ウィンドウのサイズを大きくしたい際にはどのような処理をすればよいのでしょうか?

nil
記事: 428
登録日時: 13年前

Re: FPS

#6

投稿記事 by nil » 12年前

SetGraphModeをはじめに一度だけ呼び、メインループの中で呼ばなければいいと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: FPS

#7

投稿記事 by softya(ソフト屋) » 12年前

アナログモニタの時代はその方法でも良かったんですけどね。
方法は2つあります。
(1) 今の解像度のまま第2の描画バッファに描画した上で、モニタのサイズで描画できる裏画面に拡大して描画する方法。
(2) 画面解像度を見て、画面解像度に合わせて画像自体を個別に拡大して描画する方法。
どちらにしろモニタには16:9のものや16:10、4:3など様々なアスペクト比のモニタがあるので何もせず拡大は見栄えの悪くなるモニタが必ず出ます。

(2)の方が綺麗ですが画面サイズに合わせて座標が変わるのが面倒です。
(1)の方法は楽ですが、やはり見栄えが劣ります。

DXライブラリ掲示板の過去リンクです。
「いろんなパソコンやモニターで全画面表示」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... st&no=2506
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SOJO

Re: FPS

#8

投稿記事 by SOJO » 12年前

>涼雅さん
 SetGraphMode()は始めに一度だけ読み込んで使用しているのですが、FPSが設定値より小さくなります。

>softya(ソフト屋) さん
 現在のプログラムだけで重い状況なので、できれば軽い処理でウィンドウを大きくしたいのですが、他に方法はないのでしょうか?身勝手で申し訳ないです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: FPS

#9

投稿記事 by softya(ソフト屋) » 12年前

SOJO さんが書きました:>涼雅さん
 SetGraphMode()は始めに一度だけ読み込んで使用しているのですが、FPSが設定値より小さくなります。

>softya(ソフト屋) さん
 現在のプログラムだけで重い状況なので、できれば軽い処理でウィンドウを大きくしたいのですが、他に方法はないのでしょうか?身勝手で申し訳ないです。
>SetGraphMode()は始めに一度だけ読み込んで使用しているのですが、FPSが設定値より小さくなります。

別の問題な気がします。
本当に重いのか時間を計測しましたか?
CPUの処理時間でFPSが落ちているのか、描画が処理落ちしているのか確認してください。

あとコンパクトな再現コードを作ってみると原因が判明するかも知れません。
 コンパクトにすると再現しない → 別の原因だった。
 コンパクトで再現 → みんなに見てもらえる。

それと SetGraphModeで設定している画面モードはいくつのサイズで何色なのでしょうか?
特殊なサイズなのですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SOJO

Re: FPS

#10

投稿記事 by SOJO » 12年前

>softya(ソフト屋)
 他の処理をコメントアウトしてSetGraphMode()のあるなしで検証を行ったところ、SetGraphMode()があるときにFPSが減りました。関数の引数としては

SetGraphMode(850, 650, 32);

で使用しています。多分、どこかのサイトに乗っていたのをコピーしてきたものだと思います。あと、ウィンドウのサイズはもっと大きくしたいと考えています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: FPS

#11

投稿記事 by softya(ソフト屋) » 12年前

SOJO さんが書きました:>softya(ソフト屋)
 他の処理をコメントアウトしてSetGraphMode()のあるなしで検証を行ったところ、SetGraphMode()があるときにFPSが減りました。関数の引数としては

SetGraphMode(850, 650, 32);

で使用しています。多分、どこかのサイトに乗っていたのをコピーしてきたものだと思います。あと、ウィンドウのサイズはもっと大きくしたいと考えています。
それだけでは描画が遅いのかCPUが遅いのか判別ができません。
両者は同時並行で動作するためちゃんと計測しないとどちらが原因かを判別できませんので必ず計測してください。

それと、860,650は凄く特殊な解像度だと思います。
実はSetGraphMode(800, 600, 32);としたら普通に動きませんか?(画面内の物体の位置は気にしないとして)
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SOJO

Re: FPS

#12

投稿記事 by SOJO » 12年前

softya(ソフト屋) さんが書きました:
SOJO さんが書きました:>softya(ソフト屋)
それだけでは描画が遅いのかCPUが遅いのか判別ができません。
両者は同時並行で動作するためちゃんと計測しないとどちらが原因かを判別できませんので必ず計測してください。

それと、860,650は凄く特殊な解像度だと思います。
実はSetGraphMode(800, 600, 32);としたら普通に動きませんか?(画面内の物体の位置は気にしないとして)

    SetGraphMode(800, 600, 32);

としたのですが、処理速度は変わらないです。

/*********************************************************************************************************************/

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);

while( ProcessMessage()==0 && ClearDrawScreen()==0 ){
       Update(); //更新
Draw(); //描画
ScreenFlip();
Wait();
}
}

/*********************************************************************************************************************/

処理をこれだけにしたのですがFPSが大きく異なりました。SetGraphMode()コメントアウトした際はFPSは安定しました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: FPS

#13

投稿記事 by softya(ソフト屋) » 12年前

フォーラムルールをお読みになりましたか?  http://dixq.net/board/board.html
この機会に読んでいただきたいと思います。
ソースコードを貼る時に便利なcodeタグという便利な機能についての説明もあります。

速度低下ですが、SetGraphMode(800, 600, 32);に関しては置いてある場所が問題です。
この順番だとSetDrawScreen( DX_SCREEN_BACK ); が無効になっているので再設定が必要ですよ。

「DXライブラリ置き場 リファレンスページ」
http://homepage2.nifty.com/natupaji/DxL ... .html#R4N1

コード:

#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();
	}
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

SOJO

Re: FPS

#14

投稿記事 by SOJO » 12年前

 再設定を行ったら60fpsで安定させることができました。
 
 このサイトを利用したのが初めてで、フォーラムルールをしっかり読んでいませんでした。

 いろいろとご丁寧にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る