問題タブ [vsync]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - VSync を使用するかどうか
OpenGL を使用して開発している新しいゲームに VSync を使用するかどうかを決定しています。目標は、ユーザーに最高のゲーム体験を提供し、パフォーマンスと品質のバランスをとることです。このゲームは、古い (Intel/Netbook) コンピューターと新しい (NVidia/i7 デスクトップ) コンピューターの両方で動作するように設計されています。ただし、VSync の目的はテアリングを防ぐことであることは承知しています。VSync をオフにしても、このテアリングの問題を再現できませんでした。最高の体験を提供するため; VSync をオンまたはオフにする必要がありますか?
html - HTML5キャンバスでvsyncコールバックを取得するにはどうすればよいですか?
HTML5キャンバスでコールバックをvsyncするにはどうすればよいですか?
wpf - vsyncのwpf待機(イメージ)
カメラ フィードを ImageSource に更新する UDP API を使用します。ViewModel の ImageSource を更新するタイマーがあり、WPF が画面上の画像をデータバインドします。
タイマーにはリフレッシュレートと同じ回数の間隔がありますが、これは画面の更新と同期していることを意味しないので、涙が出ます.
SlimDX、XNA opengl などを使用すると、リフレッシュ レートに簡単に同期できますが、WPF でどのように解決すればよいですか?
c++ - Direct3D 11 に GetRasterStatus がありません。垂直ブランク期間を検出するにはどうすればよいですか?
画面上の刺激の提示時間の測定に最大の精度が必要なアプリケーションを更新しています。これは現在、かなり前に放牧された DirectDraw で作成されており、グラフィック ライブラリを更新する必要があります。
プレゼンテーション時間を測定する方法は、垂直ブランク期間の終了を検出することを利用しています。具体的には、プライマリ サーフェスにフリップされたもの (またはスワップ チェーンで提示されたもの) が実際に画面によって描画されているときに、可能な限り正確に知る必要があります。スキャン ラインを検出すると、その測定の確実性を高めることができますが、Flip または Present が呼び出された直後に垂直空白期間が終了した時点を検出するだけで作業できます。
Direct 3D 9 にはIDirect3DDevice9::GetRasterStatus メソッドがあります。このメソッドは、デバイスが垂直ブランクにあるかどうか、および現在のスキャン ラインを記述する InVBlank ブール値を含む D3DRASTER_STATUS 構造体を返します。DirectDraw にも同様の機能があります ( IDirectDraw::GetVerticalBlankStatus、また、垂直ブランク中に DDERR_VERTICALBLANKINPROGRESS を返す IDirectDraw::GetScanLine を使用して VB を検出できます)。
ただし、Direct3D11 で同様の機能を見つけることができませんでした。この機能が Direct3D9 と Direct3D11 の間で移動または削除されたかどうか、後者の場合はその理由を知っている人はいますか?
android - 60Hz でのアニメーションはどのように機能しますか?
Androidでスクロールするためにスレッドを使用しています。スレッド実行方法は古典的です。インターネットで撮った 私のビューはSurfaceViewです。
私が理解していないのは、なぜ doDraw (画面に描画される) が 1 秒あたり正確に 60 回呼び出されるのですか? そして、なぜシンクロの問題がないのですか?
LCDの仕組みはわかりませんが、画面シンクロを待たずにスクロールすると、画面の上が前の画像、下が正しい画像を表示することがあります。Androidでは問題ありません。
一種のダブルバッファリングを処理するのはSurfaceViewですか?もしそうなら、いつフリップが行われますか?
インターネット上でそれに関する情報が見つかりません!
ありがとうエティエンヌ
android - Android GLSurfaceView ~56fps - スワップを制御するには?
基本サンプルを実行する場合: http://android-developers.blogspot.com/2009/04/introducing-glsurfaceview.html
System.currentTimeMillis() を使用して基本的なタイミングを追加するか、ネイティブ コードにドロップして clock_gettime(CLOCK_REALTIME_HR, &res) を使用すると、表示されるのと同じ結果が得られます。両方を別々にテストしました。
私は常にフレームレートを ~56 と計算しています。これは、フレーム間のおおよその平均 18 ミリ秒です。フレームのタイミングは完全な科学ではないことを認識しています(タイマーの精度、バックグラウンドで何かを実行しているデバイス)。glClearでさえも、まったく何もせずに実行させました。1 時間後に得られた結果は、1 分間実行した場合とほぼ同じです。
真の 59/60 fps を実現するために多くのことを試しました。自分のデバイス (HTC Incredible S) ではないかと考え始めています。Samsung Galaxy S と Nexus S の両方を試しましたが、結果は同じでした。タブレットでは、この動作はまったく見られません。私の EEE Transformer と Xoom では、1 フレームあたり一貫して 16 ミリ秒を取得します。
これにより、VSYNC が問題であり、その世代の Android フォンの vsync が遅いと思われます。本当に VSYNC は ~16ms のはずです。真の 60 fps を達成することはまずありませんが、59 fps は一般的なはずです。
他の誰かがこれを経験しましたか?vsync を無効にするためのヒントはありますか? それは不可能だと思います。レンダリングの「スワップ」ステップを制御するためのヒントはありますか?
windows - 複数のOpenGLウィンドウをvsyncに同期する
Windowsアプリケーションで、複数のOpenGLウィンドウを同時に開いています。理想的には、これらのそれぞれを60 fpsで描画し、画面の更新に同期させたいと思います。
レンダリングコンテキストごとwglSwapIntervalEXT(1)
に、vsyncをオンにするように呼び出しています。各ウィンドウには独自の表示スレッドがあり、フレームを描画してSwapBuffers
から更新を呼び出します。
ウィンドウが互いに「競合」していることがわかります。SwapBuffers
呼び出しは同期されており、別々のスレッドにある場合でも、互いに待機しているように見えます。各ウィンドウのフレーム間時間を測定しています。ウィンドウが2つある場合、これは30 fpsに低下し、3〜20fpsなどになります。
でvsyncをオフにするとwglSwapIntervalEXT(0)
、開いているウィンドウの数に関係なく、60fpsで正常に更新されます。ただし、1つのウィンドウを開いている場合、これはvsyncをオンにした場合ほどスムーズではありません。
OpenGLで私が望むことを達成する方法はありますか?
opengl - 垂直同期ごとに正確に 1 つのレンダリングを行う方法 (繰り返しなし、スキップなし)?
フレームをスキップしたり繰り返したりすることなく、垂直同期ごとに正確に 1 つのレンダリングが実行されるように、垂直同期レンダリングを実行しようとしています。これは、Windows 7 および (将来的には) Windows 8 で動作するために必要です。
基本的にはQUADS
、元の画像のピクセルが画面上のピクセルと 1:1 で一致するように、画面に収まるシーケンスを描画することで構成されます。OpenGLでもDirectXでも、レンダリング部分は問題ありません。問題は正しい同期です。
WGL_EXT_swap_control
私は以前、描画してから呼び出して、拡張機能を使用してOpenGLを使用しようとしました
glFlush() と一緒にこれら 2 つの命令のすべての組み合わせと順列を試しましたが、信頼できるものではありませんでした。
次に、描画してから呼び出すことにより、Direct3D 10で試しました
ここでg_pSwapChain
とIDXGISwapChain*
はpOutput
そのIDXGIOutput*
SwapChain に関連付けられています。
OpenGL と Direct3D の両方のバージョンの結果は同じです。たとえば、60 フレームの最初のシーケンスは、本来あるべき状態で持続しません (60hz で約 1000 ミリ秒ではなく、1030 ミリ秒または 1050 ミリ秒のように持続します)。正常に動作しますが (約 1000.40ms)、時々フレームがスキップされるようです。で採寸しQueryPerformanceCounter
ます。
Direct3D で、WaitForVBlank だけのループを試行すると、1000 回の反復の継続時間は一貫して 1000.40 で、変動はほとんどありません。
したがって、ここでの問題は、呼び出された各関数がいつ戻るか、およびスワップが垂直同期中に行われたかどうか (テアリングを避けるために以前ではない) を正確に把握していないことです。
理想的には (私が間違っていなければ)、私が望むものを達成するには、1 つのレンダリングを実行し、同期が開始するまで待ち、同期中にスワップし、同期が完了するまで待ちます。OpenGLまたはDirectXでそれを行う方法は?
編集:
わずか 60x のテスト ループはWaitForVSync
、1000.30ms から 1000.50ms まで一貫してかかります。Present(1,0)
beforeを使用した同じループはWaitForVSync
、他に何もレンダリングせず、同じ時間がかかりますが、フレームを繰り返したかのように、失敗して 1017 ミリ秒かかる場合があります。レンダリングがないため、ここに何か問題があります。
windows - Windows用のCVDisplayLink代替品?
Mac OS Xでは、CVDisplayLinkは、画面を確実に更新して、ティアすることなく60fpsのアニメーションを実現するための優れた方法を提供します。OpenGLと互換性のある同様のインターフェイスがWindowsにありますか?
もちろん、vsyncの待機中にブロックすることは可能ですが、これは、同時にアニメーション化する必要がある複数のウィンドウには対応していません。Windowsでは、OS Xとは異なり、すべてが互いに待機します(したがって、vsyncを待機する2つのウィンドウはそれぞれ30 fpsに低下します)。
たとえば、ビデオプレーヤーはどのようにしてスムーズな画面更新を実現しますか?
c# - 画面がいつ更新/更新されたかを知る方法はありますか(OpenGLまたはDirectXかもしれませんか?)
現在、c#で(.NETを使用して)作成しているアプリケーションがあります。このアプリケーションでは、ユーザーが画面に画像を表示したらすぐに、キーを押して応答するまでタイマーを開始する必要があります。
モニターの入力遅延と応答時間、キーボードがメッセージを物理的に送信するのにかかる時間、メッセージを処理するためのOSなどを考えると、これは実際には非常に難しいことに気付きました。
しかし、私はそれをほぼ一定のエラーに減らすために最善を尽くしています(応答時間の結果は、あるユーザーを次のユーザーと比較するために使用されるため、一定のエラーは実際には問題ではありません)。ただし、厄介なハードルはモニターのリフレッシュレートによって引き起こされる変数です。これは、onPaintメッセージが呼び出されて処理されたときに収集されるため、画像が実際に処理されてグラフィックバッファーから送信されたという意味ではありませんか?
残念ながら、時間制限やその他のコミットメントにより、Windows用のc#でこのタスクを続行することが現実的に制限されます。
では、私が疑問に思っていたのは、OpenGLまたはDirectXですべての描画を処理するのか、それともOpenGLまたはDirectXのいずれかを使用して画面が更新されたときにイベントを作成できるのであれば、それでもよいのでしょうか。
以前に私に与えられたもう1つの提案は、V-Syncに関するものでした。これをオフにすると、画像は描画されるとすぐに送信されますか?モニターのリフレッシュレートに同期した設定レートで画像を送信するのとは対照的に?