トップページ > 過去ログ > 記事閲覧
GetNowHiPerformanceCountの精度
名前:lunar 日時: 2007/05/08 22:58

GetNowHiPerformanceCountを用いているのですが、最初は1μ秒単位の分解能で計測できているのですが、 なぜか↓のログ同様、分解能が16384μ秒になることがあるようです。 ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=136 ウィンドウでプログラム起動→メニュー画面→ゲーム開始→ゲームを中断し、データなどを初期化して、フルスクリーンに→メニュー画面→ゲーム開始 という状況で発生したので、調べてみたところ、 ・メニュー画面からゲームを始めずフルスクリーンにした場合、問題なかった。 ・フルスクリーンでプログラム起動した場合も、ウィンドウモードにしたときに同様な現象が発生した。 ということが分かったので、 おそらく、 GetNowHiPerformanceCountを1度以上呼び出した後に、ChangeWindowModeを呼び出すと、そのような問題が発生するようです。 (別のプログラムを書いて追試してみてもその状況が再現されないので違う原因によるのかもしれませんが。) とにかく、バグがあるように思われますので、報告まで。

Page: 1 |

Re: GetNowHiPerformanceCountの精度 ( No.1 )
名前:管理人 日時:2007/05/14 01:04

 lunarさんどうも、DXライブラリの管理人です。  ご報告有難うございます。  調べてみたところ、Borland C++ Compiler 5.5 版のDXライブラリでは 最高精度が2000μ秒となってしまっていました。  修正版をアップしましたので、宜しければお試しください。m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)  ただ、今回私の環境で発見した現象はある時点からではなく、常になので lunarさんが遭遇した現象とは違うものだと思います。  とりあえず修正版のライブラリで以下の様なテストプログラムを組んで 試してみた限りでは途中でカウンタの精度が下がることはありませんでしたので、 宜しければlunarさんの環境でも正常な値が表示されるかお試しになってみて下さい。m(_ _)m (因みに GetNowHiPerformanceCount 関数自体が少々重いので画面に表示される値は 1ではなく10〜80あたりをふらふらすると思います(- -;) #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { LONGLONG time, time2; int flag; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // メインループ flag = TRUE; while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen(); // タイマーの精度を測る time = GetNowHiPerformanceCount(); while( ( time2 = GetNowHiPerformanceCount() ) - time == 0 ){} time = time2 - time; // 精度を描画 DrawFormatString( 0, 0, GetColor(255,255,255), "%I64d", time ); // 裏画面の内容を表画面に反映 ScreenFlip(); // 何かキーが押されたらウインドウモードを切り替える if( GetInputChar( TRUE ) != 0 ) { flag = !flag; ChangeWindowMode( flag ); SetDrawScreen( DX_SCREEN_BACK ); } } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }

Page: 1 |