今DirectDrawを使ったプログラムを組んでいて、そのプロジェクト内でFPSの制御関数(図1)を作りました。その関数は引数を1つ持っていて、その引数に渡した値がそのままフレームレートになるはずなのですが、実際は引数に指定した値よりもフレームレートが落ちています。
図1
FpsControl(60);
↑
1/60フレームレート
FPS制御をしていない時にFPSを計ったときには500~600fps
は出ていましたので処理自体が遅いわけではないと思います。
FPS制御関数はメッセージループ部分(図2)で使っています。
図2
while(TRUE){
//メッセージがある場合
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message == WM_QUIT)break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}else{//メッセージが無い場合
if(FpsControl(60))Game_Main();//プログラ ムのメイン部分 ↑
↑
} ↑
↑
**ここで使ってます**
関数の内部処理は何度も確認したので間違ってないと思います。
ずっとこのバグについて考えいろいろ試しましたが、
結局原因はわからずここに助けを求めに来ました。
お願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
開発環境や実際のFpsControl関数が何をやってるかわかりませんが、
とりあえず下記のようにやればできると思います。
// メッセージループ
while(TRUE){
if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ){
// 通常のWindowメッセージの処理
:
:
}
else{
// FPS制御
static INT now_time = 0, old_time = 0;
timeBeginPeriod(1);
now_time = timeGetTime();
timeEndPeriod(1);
if( (now_time-old_time) >= (1000/60) ){
old_time = now_time;
// メイン処理
Game_Main();
}
}
}
No.1
- 回答日時:
こんにちは、honiyonです。
精密にフレームレートを計算するには、様々な処理にかかる時間を考慮しないとダメだと思います。
FpsControl(60) とすると、60fpsだから、0.1msec待機する、という処理になっていませんか?
例えば表示処理に0.05msecかかっていたとすれば、1フレームにつき0.05msecの誤差が出ます。これを考慮しないといけません。
これの解決の一例ですが、
1.処理の開始にFpsControl_Startを呼び出す。(ここで時間計測開始)
2.表示処理を行う
3.FpsControl_Wait(60)を呼び出す。
ここで60fps計算で、0.1msecまたならければならない。しかし1~3までくるのに0.05mesecかかった。
0.1msec - 0.05msec = 0.05msecの停止とする。ただし、計算結果がマイナス(処理速度がたりない)場合は停止せずにreturnする。
なんて形にすれば良いと思います。
ちょっと分かりづらい説明かも知れませんが伝わりましたでしょうか(^^;
参考になれば幸いです(..
#的外してたらスイマセン...
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript javascriptで入力フォームが空欄の時にアラートによるエラーを出すコードを書いています。 2 2023/06/13 17:58
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- 防犯カメラ・監視カメラ・小型カメラ Windowsのカメラ機能。設定した通りのfpsでの撮影ができず、コマ落ち動画になる。修正するには? 2 2023/01/29 09:50
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
シャットダウン時のExcel強制終...
-
ACCESS側からEXCELの書式を設定...
-
VBA kernel32 の意味
-
メッセージBOXの「はい」「いい...
-
VBSで応答不要のメッセージボッ...
-
Excel VBA で処理中断(DoEvents...
-
MFCのワーカースレッドとUIスレ...
-
【C#】 あるイベントから別イ...
-
マルチスレッドを実現したい
-
EXCEL VBA「Application.Displa...
-
メッセージボックスのボタン名変更
-
ウィンドウ内でマウスが乗ると...
-
VC++のwin32アプリ作成における...
-
<input type="file">タグで「キ...
-
VBA メッセージボックスを自動...
-
VB.NET開発(イベントプロシー...
-
CreateCompatibleDCを初期化時...
-
スタティックテキストが表示さ...
-
ASP.NET 2.0で悩んでます。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBSの処理中一旦処理を止めて再...
-
VBA kernel32 の意味
-
VBSで応答不要のメッセージボッ...
-
VBA メッセージボックスを自動...
-
ACCESS側からEXCELの書式を設定...
-
Application.ScreenUpdating=Fa...
-
エクセルVBAでクリップボード内...
-
Excel VBA で処理中断(DoEvents...
-
【C#】 あるイベントから別イ...
-
Excel VBA 自動的に閉じるMsgBox
-
VBA、UserFormを前面に出力して...
-
マウスのクリックを無視したい
-
ASP.NETでのメッセージ画面を出...
-
EXCEL VBA「Application.Displa...
-
B列に特定の文字列が入っている...
-
MFCのワーカースレッドとUIスレ...
-
DoEvents
-
VCでウエイトをミリ秒でかけ...
-
「キャンセル」ボタン付きの処...
おすすめ情報