• 締切済み

ウインドウ描画のタイミングの制御について

OpenGLで描画した結果を,自分で指定した時間だけ遅らせて ウインドウに提示したいと考えております. ※たとえば,入力して,10msec経過してから,ディスプレイを描画するなど ご助言を頂けますと幸いです. [現在試している環境]: C++,GLUT GLUTで指定する描画関数 glutDisplayFunc(display);  待機命令: Sleep関数 [試したこと] GLUTで指定した描画関数displyの中で,待機命令を与えました. 処理時間を計測した結果,待機命令分,必ずしも遅れていないことがわかりました. ※例えば,Sleep(10)という記述をdisplay関数内に書いても,10msec遅れない,1,2msec程度しか遅れが発生しない.しかし,Sleep(50)というように待機時間を増やすと,大体49msec程度遅れる. GLUTはdisplay関数は,必ずしも描画される保証はないと,友人に言われましたが, どのようにすれば,任意に画面描画タイミングを決められるのでしょうか? OpenGLを使用して,画面描画タイミングを任意に設定できないものなのでしょうか? ゲームやグラフィックカード等では,やっているような気がしますので方法はありそうなのですが 検討がついていない状態です. 不勉強で申し訳ありませんが,ご助言を頂けませんでしょうか? どうぞよろしくお願いいたします.

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

今気づきましたが、もしかして赤と緑を交互に表示して1秒間に28枚と32枚を表示したいと言うことでしょうか? それだとテレシネ変換に近い力技が必要です。 http://www.mediajoy.com/mjc/movie_club/film2video/1.html 場合によりコマ数の多いフレームを増やすわけです。 例のとおりなら4コマ多いわけですから14コマ目と15コマ目とその倍数は同じ色を表示してやればご希望通り1秒間に28枚と32枚となります。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

基本的にディスプレイに同期すると思ってもらって良いと思います。 同期を切れないわけじゃないですが、どっちにしろディスプレイの周期を無視してもちゃんと表示されないので同期したほうが無難です。 こういう場合は、Sleep等でタイミングを調整するのではなく同じ画像を何周期も描画して調整するのが普通でしょう。 赤色28枚 緑色32枚ならdisplay関数で赤色を28周期、緑色を32周期描画すれば目的は達せられます。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

そもそも液晶ディスプレイが1/60秒周期(16.666・・・ms)でしか更新されないので10msなどの微妙なタイミング調整に意味はありません。

hhsato
質問者

補足

回答をありがとうございます. 回答について質問させてください. 例えば,ディスプレイ(60fps)に交互に赤色,緑色を出力するとします. そうすると,一秒間に,赤色 30枚,緑色30枚の絵を観察することができると思います. 人間は,30回の緑赤の切り替えを観察できます. 私は,緑赤が切り替わるまでの時間を伸ばしたいと考えています. 例えば,一秒間に,赤色28枚 緑色32枚 にして, 人間に,28回の緑赤の切り替えを提示したいです. 描画関数に遅れを与えることができれば,私のしたいことが実現可能だと考えているのですが,難しいのでしょうか? 描画関数内で待機命令をしても,特に影響がありません. OpenGLの描画命令が,ディスプレイの周波数と同期するように,調整しているのでしょうか?(待機命令を与えても,ディスプレイの周波数と合わせるので,10msec待機させても,ディスプレイの周期16msec待たされてしまう?) 長々と質問してしまい,申し訳ありません. どうぞよろしくお願いいたします.

関連するQ&A