雑記帳

ブログを使わずにArrangeNoteで作っている公開雑記帳

May 16, 2008 - timeBeginPeriod

娘の写真を撮りためたということもあり、あくまで習作だったRipplePictureが実は今一番のお気に入りだったりします。波紋の中から娘の写真が次々と表示されると、その成長していく様子に思わず見とれてしまいます。(^^;

が、VAIO typeT TZ90Sでしばらく見ていて気づいたのですが、Ver. 0.3.0のRipplePictureの動きがいまいち美しくありません。波紋の計算式を変更したせいかと思いましたが、ThinkPad T43では美しくなめらかに揺らぐので、計算式が原因ではないようです。

色々考えて、どうやら画面の描画間隔が一定でないことがわかりました。描画のたびにQueryPerformanceCounterの値のログを採ってみると、確かに描画間隔が一定ではありません。

おかしなことに、Virtual PC 2007やCPUモニタなどの特定のソフトを起動しているときは、波紋は美しくなめらかに揺らぐのです。このとき、QueryPerformanceCounterの値はほぼ等間隔で描画を繰り返していました。

これはどういうことなんだろう? ということで、Virtual PCやCPUモニタなどのソフトを dumpbin /imports して、使用しているAPIを調べてみたところ、どちらもマルチメディアAPIの timeBeginPeriod 関数を使っていることが分かりました。

timeBeginPeriod関数をGoogleで検索してみると、どうやらこの関数を使うことでシステムのタイマ分解能を細かくできるということなんですね。 このことは、GetTickCountの値やSleepの待ち時間にも影響を及ぼすようです。 この辺り、NyaRuRuさんの議論を参考にできるでしょう。 または、最近のWindows SDKのtimeBeginPeriod関数の備考に記事が追加されています:

This function affects a global Windows setting. Windows uses the lowest value (that is, highest resolution) requested by any process. Setting a higher resolution can improve the accuracy of time-out intervals in wait functions. However, it can also reduce overall system performance, because the thread scheduler switches tasks more often. High resolutions can also prevent the CPU power management system from entering power-saving modes. Setting a higher resolution does not improve the accuracy of the high-resolution performance counter.

Googleの検索結果を眺めていると、かなりポピュラーな話題みたいで、今まで知らなかった自分が恥ずかしいです。 だって、まさかマルチメディア関連のAPIがシステムのスレッドスケジューリングに影響を及ぼすなんてねえ...

そんなわけで、波紋がなめらかに描画されるようになったVer. 0.3.1のRipplePictureを公開します。

記事の一覧

Copyright © 2008 Koichi Yamamoto