お世話になります。
MFCでPeekMessageのようなループを処理をしている箇所というのは
どこにあるのでしょうか?
毎フレーム(VSync毎に)処理をさせたいのがある場合に
どこに入れればよいのかなと思い、探していまして。
よろしくお願いします。
VSync毎にってのは難しいと思う。
CWinApp::Runだけど。
返信ありがとうございます。
>CWinApp::Runだけど
これを自分でオーラーライドした場合は、
MFCでのメッセージ処理を自分が書かないと駄目ですよね?
(CWinApp::Runのソースが用意されていないので、どのようにすれば良いでしょうか?)
また、VSync毎でなくても、ウィンドウズからメッセージがこない場合に
必ず処理させたいという感じなのですが、やはりCWinAppのRunでしょうか?
よろしくお願いします。
>毎フレーム(VSync毎に)処理をさせたいのがある場合に
グラフィックなどを「VSync信号」のタイミングで高速処理したいんですよね?
PC-DOSやPC9801のときは出来たみたいですけどWINDOWSでは直接グラフィックボード
のドライバーを直接操作しないとだまかも知れないです。
DirectX等で出来るかな?
>また、VSync毎でなくても、ウィンドウズからメッセージがこない場合に
>必ず処理させたいという感じなのですが
「OnIdle」ですね。
修正
>しないとだまかも知れないです。
しないとだめかも知れないです。
返信有り難うございます。
なるほど、VSyncの場合はDirectXを使うのが手っ取り早そうですね。
でも、DirectXでもVsyncをまってフリップメソッドをどこかで呼ばないといけいなのです
が、それは教えていただいたOnIdleで呼べばいいのでしょうかね?
>なるほど、VSyncの場合はDirectXを使うのが手っ取り早そうですね。
まず、このことはいいですか?
>グラフィックなどを「VSync信号」のタイミングで高速処理したいんですよね?
DirectXは可能性として発言しただけでそういう関数等があるかどうか
僕にも分りません。
>でも、DirectXでもVsyncをまってフリップメソッドをどこかで呼ばないといけ
>いなのですが、それは教えていただいたOnIdleで呼べばいいのでしょうかね?
OnIdleは次のための関数です。
>ウィンドウズからメッセージがこない場合に必ず処理させたい
>という感じなのですが
>「VSync信号」のタイミングで高速処理
アプリケーションの作成でそこまでやるってことは
すごい高速のアプリケーションコードで書かれたプログラムなんですね。
すごいですね。
正確にVSync計って動かせる環境ばかりとは限りません(ノートPCなんか特に)。
ドライバに近いところを触るので、Win32APIでは直接VSyncを計れません(確か
そのはず)。
DirectXも、最終的な画面転送をVSyncに合わせるオプションはあるようです
が、直接取得するオプションは見当たりませんでした。
複雑なメッセージ処理をやってる可能性のあるメインスレッドでVSyncに同期す
るのはあまりよくありません。
一つでもVSyncの間隔より長い処理があればその回のVSync同期は失敗しま
す。
例えば、SendMessageやMessageBoxもその処理をしている間は別のメッセー
ジループを使用したりするので、その間自分で用意したメッセージループは稼動
しません。
環境により、秒間のVSyncの回数は相当ばらつきが有ります。60~120くらいあ
る場合も有るそうなので、全VSyncごとに処理する必要があるかどうか考えてみ
てください。
VSyncに同期して処理する目的によっては、必ずしも全VSyncごとに処理する
必要はありませんし、そのあたりを整理してはどうでしょう。
すいません、説明不足で。
ティアリングを出さないためにVSyncと合わせるだけなので、
VSyncに間に合わなかったら、次のVSyncまで待機しているのは問題無いです。
「初心者」って名前を変更してもらえませんか?