たまには読まれもしない長文を書いてみようかなーっとぉ!(直ってない)
JoyToKeyもどきでは、デバイスを1ms間隔でポーリングしています。そのためには1ms経つまで帰ってこない関数が必要になります。現在の実装ではSleepとtimeBeginPeriodを使って(※)います。なぜなら、負荷が低い状態ならばSleep(1); はほぼ1[ms] で帰ってくるし、これによりCPUをアイドル状態にでき、電気代の節約にもなるためです。一石二鳥なのです。
しかしこのソフトを使うときはゲームしていることが多いため、ゲーム側で高い負荷がかかる事があります。高負荷時にはSleep(n); はn[ms] では帰りません。高負荷時にはSleep(1); が10msとか20ms後に帰ってくることもザラです。
Sleepとは現在このスレッドは暇だから、指定した時間が「過ぎるまで」他のスレッドにCPU時間を譲りますよ、とOSに教える事です。そのため自分以外に高い負荷がかかるスレッド(つまりゲーム)がいれば、Sleepを呼んだスレッドに制御を戻すのを遅らせてでも、高負荷のスレッドにCPU時間を割り当てるのは当然の動きです。低負荷ならばSleep(n); がn[ms] で帰ってくる傾向がある、というだけで常にSleep(n); がn[ms] で帰ってくることは誰も保証していないのです。
Sleepを嫌うとビジーウェイト(時間がたつまでループして待つ)ことになりますが、JoyToKeyもどきがCPU 100%食うようなアプリケーションだと嫌ですよね?…どうでもいい?チッ、皆が良くても俺は嫌なんです。
これは今作っているアプリケーションに限った問題ではなく、数msごと処理を実行するという部分があれば必ず出る問題です。ビジーウェイトなしに正確な時間待つ関数を作れれば、有用だと考えます。
現在考えているのは、低負荷時にはSleepを使い、高負荷時にはビジーウェイトに切り替える関数です。予想される弱点としては、低負荷時にSleepを使って待つため一時的に高負荷になるとSleepがデッドラインを超えてしまう可能性があることです。ゲームに用いると一時的な負荷で激しく処理落ちする欠陥と言われそうですが、JoyToKeyもどきには妥当な落としどころでしょう。実装できたらまた書きます。誰もここまで読んでないだろうけど、次回をお楽しみに。
※WindowsはtimeBeginPeriod(1); を呼ぶとなぜかSleepの分解能も変わります。この副作用は昔からあるようです。とりあえず呼んどけ。
< | 2005 | > | ||||
<< | < | 11 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)