他の人からもらったフレームレートなのですが、

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

他の人からもらったフレームレートなのですが、

#1

投稿記事 by フレームレートについて » 14年前

フレームレートのサンプルをもらったのですが、一様どのような流れになっているのかを聞いたのですが、
よくわからず、投稿させてもらいました。とくにdbOldtimeをtimeGetTimeで取得したあとに、dbNewtimeをtimeGetTimeで取得していますが、これは同じ値が入るのではないのでしょうか?お願いします。補足この流れでうまくはいきます。

// -------------------------------------------------------------------------------------------------------------- //
// ------------------------------- フレームコントロール関係のグローバル変数の宣言 ------------------------------- //

static DWORD g_dwFrameCount = 0; // フレームカウント用
static double mspf = 1000.0/60;
// -------------------------------------------------------------------------------------------------------------- //
// ------------------------------------- フレームコントロール関係の関数本体 ------------------------------------- //

// FPS の制御を行う関数
BOOL WaitFrame( void )
{
// MilliSeconds Per Frame( 1 フレームにかかる時間( ミリ秒 ))
// 時間計測用
double dbNewTime = 0.0; // 現在の時間格納用 ( 今回関数の呼ばれた時間 )
static double dbOldTime =
( double )timeGetTime( ); // 過去の時間格納用 ( 前回関数の呼ばれた時間 )

static double dbSecond = dbOldTime; // 1 秒用

// フレーム計測用
static DWORD dwCnt = 0;

// 現在の時間を取得
double dbNewTime = ( double )timeGetTime( );

// 1 フレーム分の時間を測る ( 前回の呼び出しから1フレーム経過 )
// 現在の時間から過去の時間を引いて、1フレームにかかる時間よりも大きくなったら
if( dbNewTime - dbOldTime >= mspf )
{
dwCnt ++; // フレーム数 + 1
do
{
// 次の計測の為の調整
dbOldTime += mspf; // 過去の時間に、1フレームにかかる時間を足す
}while( dbNewTime - dbOldTime >= mspf );// 非アクティブからアクティブに変わった時の調整

// 1 秒を測る ( 1秒間の FPS を表示するため )
if( dbNewTime - dbSecond >= 1000.0 )
{
g_dwFrameCount = dwCnt; // 1秒経過ごとにフレームカウントの更新
do
{
dbSecond += 1000.; // 次の計測の為の調整
}while( dbNewTime - dbSecond >= 1000. );

dwCnt = 0; // フレーム数リセット
}
return TRUE;
}
return FALSE;
}

アバター
GRAM
記事: 164
登録日時: 14年前
住所: 大阪

Re: 他の人からもらったフレームレートなのですが、

#2

投稿記事 by GRAM » 14年前

コードタグでくくりましょうね^^;利用規約を一読お願いします

コード:

// -------------------------------------------------------------------------------------------------------------- //
// ------------------------------- フレームコントロール関係のグローバル変数の宣言 ------------------------------- //

static DWORD g_dwFrameCount = 0; // フレームカウント用
static double mspf = 1000.0/60;
// -------------------------------------------------------------------------------------------------------------- //
// ------------------------------------- フレームコントロール関係の関数本体 ------------------------------------- //

// FPS の制御を行う関数
BOOL WaitFrame( void )
{
   // MilliSeconds Per Frame( 1 フレームにかかる時間( ミリ秒 ))
   // 時間計測用
   double dbNewTime = 0.0; // 現在の時間格納用 ( 今回関数の呼ばれた時間 )
   static double dbOldTime =( double )timeGetTime( ); // 過去の時間格納用 ( 前回関数の呼ばれた時間 )

   static double dbSecond = dbOldTime; // 1 秒用

   // フレーム計測用
   static DWORD dwCnt = 0;

   // 現在の時間を取得
   double dbNewTime = ( double )timeGetTime( );

   // 1 フレーム分の時間を測る ( 前回の呼び出しから1フレーム経過 )
   // 現在の時間から過去の時間を引いて、1フレームにかかる時間よりも大きくなったら
   if( dbNewTime - dbOldTime >= mspf )
   {
      dwCnt ++; // フレーム数 + 1
      do
      {
         // 次の計測の為の調整
         dbOldTime += mspf; // 過去の時間に、1フレームにかかる時間を足す
      }while( dbNewTime - dbOldTime >= mspf );// 非アクティブからアクティブに変わった時の調整

      // 1 秒を測る ( 1秒間の FPS を表示するため )
      if( dbNewTime - dbSecond >= 1000.0 )
      {
         g_dwFrameCount = dwCnt; // 1秒経過ごとにフレームカウントの更新
         do
         {
            dbSecond += 1000.; // 次の計測の為の調整
         }while( dbNewTime - dbSecond >= 1000. );

         dwCnt = 0; // フレーム数リセット
      }
      return TRUE;
   }
   return FALSE;
}
のように綺麗に見やすくなります
本題ですが
static double dbOldTime =( double )timeGetTime( ); // 過去の時間格納用 ( 前回関数の呼ばれた時間 )
に注目しましょう。
dbOldTimeはstaticつまり静的な変数です。
簡単に言うとdbOldTimeへの時間の代入操作は何度関数を呼ぼうが一度しか呼び出されていません。
一方
double dbNewTime = ( double )timeGetTime( );
こちらは関数が呼び出されるたびに値が代入されます。
よって
if( dbNewTime - dbOldTime >= mspf )
この判定とフレームが更新される時の時間の差を理想の数値以下にするための処理

コード:

do
      {
         // 次の計測の為の調整
         dbOldTime += mspf; // 過去の時間に、1フレームにかかる時間を足す
      }while( dbNewTime - dbOldTime >= mspf );// 非アクティブからアクティブに変わった時の調整
これによってフレームレートが調整できるようになるはずだというわけですね

日本語で書くと
①現在の時間と前の時間の差が1000/60ミリ秒以上か?→以上ならフレームを更新する(return TRUE)そうでないならまつ(return FALSE)
②上がTRUEを返そうとするときdbOldTimeと現在の時間との差が1000/60ミリ秒以上だから、 
  保存しているdbOldTimeと現在の時間との差が1000/60ミリ秒以内になるように調整する。
③次に呼び出すときはまた①に戻って考える
こうすることで常に約1000/60ミリ秒の間隔でTRUEが戻るというわけでしょう

フレームレートについて

Re: 他の人からもらったフレームレートなのですが、

#3

投稿記事 by フレームレートについて » 14年前

指摘ありがとうございます。今後気をつけます。
丁寧な解説ありがとうございます。

閉鎖

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