トップページ > 記事閲覧
キー判定が消えるまで待つ関数の追加希望
名前:yumetodo 日時: 2017/07/12 15:42

例えばMessageBox関数を呼び出して制御が戻った直後など、意図しないキー判定が残っていることがあり、 https://github.com/yumetodo/Novel.Game.Engine.LINKS/blob/b9d5c5bb4d0b9920dcdb277150a27113300906d1/keystate.cpp#L38 bool KeyState::flush_stream() noexcept { using namespace std::chrono_literals; char buf[2][keybufsize] = {}; for (size_t i = 0; i < this->keystatebuf.size(); ++i) buf[0][i] = 0 != this->keystatebuf[i]; char* first_p; char* last_p; size_t i; for (first_p = buf[0], last_p = buf[1]; 0 == ProcessMessage() && 0 == DxLib::GetHitKeyStateAll(last_p); std::swap(first_p, last_p)) { for (i = 0; i < keybufsize && !first_p[i] && !last_p[i]; ++i); if (i == keybufsize) return true; std::this_thread::sleep_for(2ms); } return false; } こういう関数を作って判定が消えるまで待つようなコードを書いていたのですが、 DxLib::GetHitKeyStateAllのコストも結果の0比較のコストも無視できないコストがかかってしまいます(当方環境で1000ms程度) 0比較をSIMD化しようかと考えましたが、計算コスト的にO(N)なことに変わりはなく、 DxLib::GetHitKeyStateAll内部でもO(N)な処理であるコピーを行っているのでなんか違うなと思うわけです。 前にDxLib::GetHitKeyStateAllの実装を読んだ感じではこれはDxLib側でやればもっと効率的になると思います(コピーコスト+比較演算コストの削減)。 というわけで、このような関数をDxLibに追加していただけないでしょうか? ref: - github.com/S-H-GAMELINKS/Novel.Game.Engine.LINKS/pull/28
メンテ

Page: 1 |

Re: キー判定が消えるまで待つ関数の追加希望 ( No.1 )
名前:管理人 日時:2017/07/13 01:34

> DxLib::GetHitKeyStateAllのコストも結果の0比較のコストも無視できないコストがかかってしまいます(当方環境で1000ms程度) 1000ms とは 1秒のことでしょうか? それはあまりにも時間が掛かりすぎているので、何か別の原因があるような気がします… 手元で yumetodoさんの関数を参考に以下のようなプログラムを作成して実行してみましたが、 flush_stream に掛かる時間は概ね 4μsec 前後でした ( ProcessMessage() を呼び出している関係か定期的に 100μsec 以上掛かっていますが… ) #include "DxLib.h" #define KEYBUFSIZE 256 bool flush_stream() { char buf[ 2 ][ KEYBUFSIZE ] = {}; GetHitKeyStateAll( buf[ 0 ] ); char* first_p; char* last_p; size_t i; for (first_p = buf[0], last_p = buf[1]; 0 == ProcessMessage() && 0 == DxLib::GetHitKeyStateAll(last_p); ) { for (i = 0; i < KEYBUFSIZE && !first_p[i] && !last_p[i]; ++i); if (i == KEYBUFSIZE) return true; Sleep(2); char* temp = first_p; first_p = last_p; last_p = temp; } return false; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ(何かキーが押されたらループを抜ける) while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; LONGLONG Time = GetNowHiPerformanceCount() ; flush_stream() ; Time = GetNowHiPerformanceCount() - Time; DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Time:%d", ( int )Time ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 速度的に問題は無い様に思いますので、専用の関数を追加する必要は無い気がします (・・;
メンテ
Re: キー判定が消えるまで待つ関数の追加希望 ( No.2 )
名前:yumetodo 日時:2017/07/19 13:46

あれ、なんで手元だとこんなに遅かったんだろう、再度検証したら1ms以下に収まる・・・ もう少し検証します。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存