2017年7月3日月曜日

VSYNC問題

グラボのドライバの中にはVSYNC待ちを無視してくれるものがあって、そういうドライバに当たると描画が忙しくてメッセージの転送や処理が回らなくなることがある。また逆に画像転送などのようにメッセージ処理に時間を取られて描画が疎かになったりする。なので描画とメッセージ処理を別のスレッドにした。スレッドの管理にはpthreadを使う。

メッセージ処理といってもテクスチャのアップデートなどがあるので描画スレッドとOpenGLのリソースは共有しなければならない。X環境ではこれはglXCreateContextでGLXコンテキストを作るときに元のGLXコンテキストを指定してやることでできる。なお、子コンテキストは親スレッドで作る

で、子コンテキストを作ったらスレッドを起こす。スレッドで子コンテキストをglxMakeCurrentすればおしまい。glxMakeCurrentを調べればわかるがpthreadのスレッドはGLXコンテキストを切り替え対象にしててちゃんと切り替えてくれる。余計な心配は要らない。

1 件のコメント:

  1. やってみたところ、ダブルバッファのスワップ後にglFinishして待たせるとVSYNCの時は待ってくれるがテクスチャの書き換えが入ると当然だけどglFinishで待っちゃってメインスレッドがちゃんと回らなくなる。もうね、VSYNC待たなくてもいいからVSYNCのタイミングがわかるようにしたい。結構難しいんだけど。

    返信削除

引っ越すことにした。

引っ越し先。 見えるかな。