C#でFPSを60にする方法

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

C#でFPSを60にする方法

#1

投稿記事 by leaf8429 » 10年前

いつもお世話になっております。

プログラムを書いていてまたわからないことができましたので,質問したいと思います。

(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を出すことができないのであれば,
実際にプログラムに使う場合,どうすればよろしいでしょうか?

お答えいただけるとありがたいです。 どうかよろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C#でFPSを60にする方法

#2

投稿記事 by みけCAT » 10年前

leaf8429 さんが書きました:(A)『新ゲームプログラミングの館』3章-14の「特定のFPSで動作する」に記述されているプログラムを
C#用に直して記述、実行すると,CもしくはC++の開発環境で実行する場合と違い,
FPS表示が非常に小さくなります。(リフレッシュレート40ヘルツで26程度,レート60ヘルツで42程度,Cで書いた場合はきちんと60近く出ます。)
まず、移植の際にエンバグしたということは考えられませんか?
DXライブラリでScreenFlipを用いる場合、きちんと描画先を裏画面に設定していますか?
移植したコードを貼っていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

leaf8429

Re: C#でFPSを60にする方法(コード)

#3

投稿記事 by leaf8429 » 10年前

移植したコードを貼っていただけますか?
とのことですので,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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C#でFPSを60にする方法

#4

投稿記事 by みけCAT » 10年前

・DX.DxLib_Init()を2回呼び出しているのが気になります。1回のみ呼び出すべきだと思います。
・DX.DxLib_Init()を呼び出す前にDX.SetDrawScreen(DX.DX_SCREEN_BACK)を呼び出しても、効果が出ないかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

leaf8429

Re: C#でFPSを60にする方法

#5

投稿記事 by leaf8429 » 10年前

・DX.DxLib_Init()を呼び出す前にDX.SetDrawScreen(DX.DX_SCREEN_BACK)を呼び出しても、効果が出ないかもしれません。
実際に指摘されたところを直してみた所,リフレッシュレートが40ヘルツの時40FPSに,
60の時に60FPSになりました。

一先ず無事に解決しました。有難うございました。

閉鎖

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