ScreenFlip(); が1回実行されるのにかかる時間を計測してみよう そのためにGetNowCount()関数を用います

マックス「


リフレッシュレートがいくらに設定されていても


十字キーを押した時の自分の飛行機の1秒間の移動量(移動スピード)を


リフレッシュレートが144Hz💖💖💖のときと常に同じに保ちたければ



int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;

if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;

if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;

if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4;





int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y -4* (ScreenFlip();が1回実行されるのにかかる時間)*144;

if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y +4* (ScreenFlip();が1回実行されるのにかかる時間)*144;

if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x -4* (ScreenFlip();が1回実行されるのにかかる時間)*144;

if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4* (ScreenFlip();が1回実行されるのにかかる時間)*144;


もしくは



int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y -4* (1/(ScreenFlip();が1秒間に実行される回数))*144;

if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y +4* (1/(ScreenFlip();が1秒間に実行される回数))*144;

if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x -4* (1/(ScreenFlip();が1秒間に実行される回数))*144;

if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4* (1/(ScreenFlip();が1秒間に実行される回数))*144;



に書き換えればいいのはわかったが・・・


どうやってScreenFlip(); が1回実行されるのにかかる時間を求めるかだが・・・」


ソーラー「ここで登場するのが


GetNowCount()関数です


GetNowCount();


が実行されると


GetNowCount()には戻り値として


WindowsOSが起動してからの経過時間(単位はミリ秒です)


が代入されます


マックス「ミリ秒?」


ソーラー「16ミリ秒は


0.0016秒です


つまり


GetNowCount()関数を用いれば


WindowsOSが起動してからの経過時間(単位はミリ秒です)を求めることができるというわけです


GetNowCount()関数

DXライブラリの関数置き場の解説は以下のようになっています

👇


時間関係の関数


宣言 int GetNowCount( void ) ;


概略 ミリ秒単位の精度を持つカウンタの現在値を得る


引数 なし

戻り値 Windowsが起動してから経過時間をミリ秒単位であらわした値


解説  すぐ上に書いてありますが、Windows が起動してから経過時間をミリ秒単位であらわした値が返ってきます。この関数の存在意義は時間の計測にあります。特定の時間を取得する事はこの関数では出来ません。


サンプル


 6秒間待つ

Windows用

#include "DxLib.h"


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )

{

int StartTime ;


if( DxLib_Init() == -1 ) // DXライブラリ初期化処理

{

return -1; // エラーが起きたら直ちに終了

}


// 現在経過時間を得る

StartTime = GetNowCount() ;


// 計測開始から6秒が過ぎるまでループ

while( GetNowCount() - StartTime < 6000 )

{

// メッセージ処理

if( ProcessMessage() == -1 )

{

break ; // エラーが起きたらループから抜ける

}

}


DxLib_End() ; // DXライブラリ使用の終了処理


return 0 ; // ソフトの終了

}





ですから


ScreenFlip(); が実行される前の時間



ScreenFlip(); が実行された後の時間を調べて


ScreenFlip(); が実行された後の時間からScreenFlip();が実行される前の時間を引けば


ScreenFlip(); が1回実行される時間(単位はミリ秒です)が求められるというわけです」








  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る