いつもお世話になっております。
プログラムを書いていてまたわからないことができましたので,質問したいと思います。
(A)『新ゲームプログラミングの館』3章-14の「特定のFPSで動作する」に記述されているプログラムを
C#用に直して記述、実行すると,CもしくはC++の開発環境で実行する場合と違い,
FPS表示が非常に小さくなります。(リフレッシュレート40ヘルツで26程度,レート60ヘルツで42程度,Cで書いた場合はきちんと60近く出ます。)
(B)「ここで公開されているプログラムはC,C++用の物で,C#用のFPS制御プログラムがあるのではないか」と思い検索したところ,
FPS制御のクラスはここのサイトで公開されていたのですが,
実際の使い方が書かれていないため,使い方が分からないでいます。
(コメントに返信が見られない事と2年前から記事の作成が止まっていることから,そちらのページで答えがもらえる可能性は低いと思われる)
ここのサイトで公開されている記述をどう改変すればC#で60FPSを出すことができるのでしょうか?
もしくは(B)で触れている?C#用のクラスを他のファイルで使わないとC#で60FPSを出すことができないのであれば,
実際にプログラムに使う場合,どうすればよろしいでしょうか?
お答えいただけるとありがたいです。 どうかよろしくお願いします。
C#でFPSを60にする方法
Re: C#でFPSを60にする方法
まず、移植の際にエンバグしたということは考えられませんか?leaf8429 さんが書きました:(A)『新ゲームプログラミングの館』3章-14の「特定のFPSで動作する」に記述されているプログラムを
C#用に直して記述、実行すると,CもしくはC++の開発環境で実行する場合と違い,
FPS表示が非常に小さくなります。(リフレッシュレート40ヘルツで26程度,レート60ヘルツで42程度,Cで書いた場合はきちんと60近く出ます。)
DXライブラリでScreenFlipを用いる場合、きちんと描画先を裏画面に設定していますか?
移植したコードを貼っていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C#でFPSを60にする方法(コード)
とのことですので,C#に書き直したコードを張ります。どうやらScreenFlipが悪さをしているようですが…移植したコードを貼っていただけますか?
using DxLibDLL;
using System.IO;
using System;
namespace Test
{
public static class Game
{
static int mStartTime; //測定開始時刻
static int mCount; //カウンタ
static float mFps; //fps
const int N = 60; //平均を取るサンプル数
const int FPS = 60; //設定したFPS
static void Draw()
{
DX.DrawString(0, 0, "[" + mFps + "]", DX.GetColor(255, 255, 255));
}
static void Wait()
{
int tookTime = DX.GetNowCount() - mStartTime; //かかった時間
int waitTime = mCount * 1000 / FPS - tookTime; //待つべき時間
if (waitTime > 0)
{
DX.WaitTimer(waitTime); //待機
}
}
static bool Update()
{
if (mCount == 0)
{ //1フレーム目なら時刻を記憶
mStartTime = DX.GetNowCount();
}
if (mCount == N)
{ //60フレーム目なら平均を計算する
int t = DX.GetNowCount();
mFps = (float)(1000.0) / ((t - mStartTime) / (float)N);
mCount = 0;
mStartTime = t;
}
mCount++;
return true;
}
public static void Main()
{
DX.ChangeWindowMode(DX.TRUE); DX.SetGraphMode(640, 480, 32); DX.SetWindowText(""); DX.SetDrawScreen(DX.DX_SCREEN_BACK);
//実際に書いたプログラムでは,DX.SetDrawScreen(DX.DX_SCREEN_BACK);の部分の記述を忘れていました。
//追加して書いてみたものの,記述していない時とFPSは同じでした。
DX.DxLib_Init();
if (DX.DxLib_Init() == -1) { return; }
while (DX.ProcessMessage() == 0 && DX.ClearDrawScreen() == 0 && DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) == 0)
{
Update(); //更新
Draw(); //描画
//DX.ScreenFlip();
Wait(); //待機
}
/*→*/
DX.DxLib_End();
return;
}
static void saveload()
{ //セーブデータのロード
}
}
}
//リフレッシュレート40の時:26FPS ScreenFlip無し:60FPS
//リフレッシュレート60の時:42FPS ScreenFlip無し:60FPS
Re: C#でFPSを60にする方法
・DX.DxLib_Init()を2回呼び出しているのが気になります。1回のみ呼び出すべきだと思います。
・DX.DxLib_Init()を呼び出す前にDX.SetDrawScreen(DX.DX_SCREEN_BACK)を呼び出しても、効果が出ないかもしれません。
・DX.DxLib_Init()を呼び出す前にDX.SetDrawScreen(DX.DX_SCREEN_BACK)を呼び出しても、効果が出ないかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C#でFPSを60にする方法
実際に指摘されたところを直してみた所,リフレッシュレートが40ヘルツの時40FPSに,・DX.DxLib_Init()を呼び出す前にDX.SetDrawScreen(DX.DX_SCREEN_BACK)を呼び出しても、効果が出ないかもしれません。
60の時に60FPSになりました。
一先ず無事に解決しました。有難うございました。