2013年2月21日木曜日

日記ちゃん

 「ScrLK」キーってなんでKが大文字なの、なんてLenovo付属のキーボード眺めてて思った。
手持ちのほかのキーボードではScrLkとkは小文字だったから、どっちでもいいんだろうけど。
ScrollLockのKeyなのか? 
 
 どうでもいいか。
 
 そんな感じでいつだかに言っていたスクリーンキーボードを作成しているのだけど、
SendInput()でscanCode指定をすればDirectXなアプリケーションにも対応できると検索に出てきたものの、
実際にやってみると全然反応しない。
KeyDownとKeyUpの間にSleepを入れるといいとも見かけたので試してみたがやっぱり反応せず。
 なんなんだー? ってがちゃがちゃやってたらあるときたまたまキー入力に反応。
あれこれためしてみたところ、KeyDownからKeyUpまでが早すぎると入力をキャッチできないらしく、
Sleep( 50 )ぐらいにしたらばっちり反応するようになった。
 たいていのゲームでは60FPSだろうから16msも押しっぱにすれば反応するようになると思われる。
 
 そういえばXPのときはSleepの精度が10ms間隔ぐらいだったのが、ゲームの速度を一定に保つ際に問題になったものだけど、 Windows8だとどうなってるんだろうか。あとでためしてみよう。
 
#include 
#include 
#include 
 
int main()
{
  std::vector< char > buffer;
  buffer.resize( 1024 * 1024 );
 
  FILE* file = NULL;
  file = fopen( "sleepTest.txt", "w");
  if ( file )
  {
    {
      LARGE_INTEGER frequency;
      QueryPerformanceFrequency( &frequency );
 
      LARGE_INTEGER lastTime;
      QueryPerformanceCounter( &lastTime );
 
      for (int i=0; i<100; ++i)
      {
        LARGE_INTEGER nowTime;
        QueryPerformanceCounter( &nowTime );
        LONGLONG ns = ( (nowTime.QuadPart - lastTime.QuadPart) * (1000 * 1000) ) / frequency.QuadPart;
 
        char str[ 128 ] = {0};
        sprintf( str, "[%d] %llu ns (%d ms)\n", i, ns, static_cast(ns/1000) );
        strcat( &buffer[0], str );
 
        Sleep( 1 );
        lastTime = nowTime;
      }
 
      
    }
    
 
    fwrite( &buffer[0], strlen(&buffer[0])+1, 1, file );
    fclose( file );
    file = NULL;
  }
 
  return 0;
}

といったコードで、Sleep(1)をしたときの様子を観察した。
 
XP:
[0] 0 ns (0 ms)
[1] 6750 ns (6 ms)
[2] 15622 ns (15 ms)
[3] 15623 ns (15 ms)
[4] 15629 ns (15 ms)
[5] 15620 ns (15 ms)
[6] 15648 ns (15 ms)
[7] 15599 ns (15 ms)
[8] 15625 ns (15 ms)
[9] 15623 ns (15 ms)
[10] 15626 ns (15 ms)
[11] 15624 ns (15 ms)
[12] 15617 ns (15 ms)
[13] 15625 ns (15 ms)
[14] 15623 ns (15 ms)
[15] 15624 ns (15 ms)
...
8:
[0] 0 ns (0 ms)
[1] 1027 ns (1 ms)
[2] 2023 ns (2 ms)
[3] 1984 ns (1 ms)
[4] 1997 ns (1 ms)
[5] 1999 ns (1 ms)
[6] 2000 ns (2 ms)
[7] 2002 ns (2 ms)
[8] 2003 ns (2 ms)
[9] 2030 ns (2 ms)
[10] 1970 ns (1 ms)
[11] 2001 ns (2 ms)
[12] 1999 ns (1 ms)
[13] 2003 ns (2 ms)
[14] 2001 ns (2 ms)
[15] 1034 ns (1 ms)
...
 ってな感じで、何やら差が出た。
Windows8では心置きなくSleep(1)で速度調整してもいいんじゃないかな。

0 件のコメント: