問題タブ [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.
java - Slickゲームで画面のちらつきを修正するにはどうすればよいですか?
Slickライブラリを使用してシンプルなマリオのようなゲームを書いていますが、ゲームウィンドウのちらつきに問題があります。私は通常、その下にEclipseウィンドウがあり、Eclipseが画面を更新すると、ゲーム上に何かが描画されるように見えます。
ゲームを開始すると、次のように表示されます。
LenovoThinkpadx100eでUbuntu10.04を使用しています。これは私の友人には起こらないことに気づいたので、ドライバー(flgrx)またはウィンドウマネージャー(metacity)の問題である可能性がありますが、確認する方法がわかりません。または多分それはvsyncで何かですか?
何か案は?前もって感謝します :)
macos - macOS で vsync を無効にする方法
私のすべての SDL/OpenGL プログラムでは、フレームレートが 60fps にとどまっているため、vsync が有効になっているように見えますが、私自身でもコードや設定でも有効ではありません。だから、おそらくいくつかの深いmacOS設定で、それを無効にする方法があれば、今すぐしたいと思いますか?
macos - OS X でフルスクリーンの OpenGL を使用した安定した 60hz フレームレートは可能ですか?
できるだけ滑らかにする必要があるフルスクリーンでビデオを表示するアプリケーションを作成しようとしています。
私の OpenGL コードは垂直リフレッシュ同期に同期されており、ほとんどの場合、CPU 使用率が低くても再生はスムーズです。
ただし、時々、わずかな吃音があります。
テストを簡素化し、潜在的な遅延の原因を排除するために、フルスクリーンを作成し、フレームをクリアし、バッファを交換するだけの単純なレンダリング ループを作成しました。
バッファーのスワップ時間を ( mach_absolute_time() で) 計測し、15 ~ 18 ミリ秒の範囲外の時間を出力しました。
実行例を以下に示します (レポート時間は秒単位、フレーム時間はミリ秒単位です)。
テストの時点では、XCode から別のアプリケーションを実行していませんでした。テストは、OS X 10.7.5 を実行する Macbook Pro 5,1 で実行されました。
グラフィックスの切り替え (このラップトップには Nvidia 9600 と 9400 が搭載されています)、外部モニターまたはラップトップ画面から実行しても違いはありませんでした。
基礎となる API 間の違いを排除するために、SDL、Glfw、Cinder、SFML などのグラフィックス フレームワークを使用して同じコードを試しました。最後に、公式の Apple OpenGL フルスクリーンの例のタイミングも試しました。Glfw はもう少し安定しているように見えますが、それらはすべて多かれ少なかれ同じように動作します。
SCHED_FIFO ポリシーを使用して描画スレッドの優先度を最大に上げると、状況が少し改善されるように見えますが、それほどではありません。
私は、OpenGL から安定した 60hz フレーム レートを取得することは不可能であると考え始めています。
OS X でフルスクリーンの OpenGL アプリケーションの安定した 60hz 表示レートを実現できた人はいますか? どのように?
編集:ターミナルからテストを実行すると、タイミングが大幅に改善されることに気付きました。XCode から実行すると、より多くの変動が発生するため、これらの数値を使用して結論を導き出しました。いずれにせよ、同じマシン上の Windows 7 では、動作がより安定しているように見えます。しかし、現在の変動は許容範囲内です。
directx - DWM を無効にしたウィンドウ モードでの Direct3D 10 vsync の問題
DWM を無効にしたウィンドウ モードの Direct3D 10 で vsync に問題があります。
出力をレンダリングして表示するアプリケーションがあります。ウィンドウ モードで動作する必要があり、最低 60 fps の安定した速度を生成する必要があります。アプリケーションの 1 つのバージョンは Direct3D 9 を使用し、別のバージョンの Direct3D 10 を使用しています。ウィンドウ モードで作業しているとき、時々 fps が減少します (これは「安定した」減少ではありません。ほとんどの場合、安定した 60 fps を生成していますが、突然減少することがあります)。数秒後に 60 fps に戻ります)。アプリケーションの両方のバージョンで、fps の減少は ~10 ~ 20 fps です。それは受け入れられません。
Windows Vista と Windows 7 には、「デスクトップ コンポジション」と呼ばれる新しいグラフィック システムがあり、アプリケーションが画面にピクセルを表示する方法を変更しました。デスクトップの構成は、デスクトップ ウィンドウ マネージャー (DWM) によって実行されます。DWM が有効になっている場合、アプリケーションは、DWM によってレンダリングされ、しばらくしてディスプレイに表示されるよりも、ビデオ メモリ内のオフスクリーン サーフェスに描画されます。そのため、タスク マネージャーの dwm.exe が何もしない場合 (処理時間が ~0% の場合)、fps が低下し、dwm.exe の処理時間が 1 ~ 3% かかる場合、安定した 60 fps であることに気付きました。わかった。
私たちはそれに影響を与えることはできません。したがって、高い安定した fps を得るには、DWM をオフにする必要があります。オフにすると、すべて問題ありません。アプリケーションの両方のバージョンで安定した 60 fps があります。ただし、DWM はウィンドウ モードで vsync を実行するため、それをオフにすると、自分で vsync を実行する必要があります。
しかし、DWM をオフにすると、ウィンドウ モードの Direct3D 10 で vsync に問題が発生します。モニターの上部に画像の破れがあります。Direc3D 9 は引き続き正常に動作します。
そのため、60 Hz のリフレッシュ レートのモニターがあります。
スワップチェーンの作成中に、次のようなパラメーターを設定します。
プレゼンテーション中に、vsync をオンにするフラグを設定します。
そして、次の vsync 問題があります。左側から右側に高速で移動する垂直線があります。また、モニターの上部に画像の破れがあります。
http://bit.ly/POQoFq
私たちは最初、何か間違ったことをしていると思います。そこでマイクロソフトのサンプル「Tutorial 07: Texture Mapping and Constant Buffers」を回転立方体でインストールしました。立方体を大きくし、より高く配置し、回転を速くしましたが、同じ問題が発生しました (写真を参照)。
http://bit.ly/SevNqw
http://bit.ly/RSoEhc
http://bit.ly/UjaNPu
したがって、フルスクリーン モードの Direct3D 10 ではすべて問題ありません。垂直同期は完全に機能します。Direct3D 9 でも問題ありません。DWM を無効または有効にしても、vsync は適切に機能します。DWM を無効にしたウィンドウ モードの Direct3D 10 では、問題があります。
さまざまなコンピューター、さまざまなビデオカード (Nvidia 8600 GT、Nvidia 9500 GT、ATI Radeon HD 5870 Eyefinity 6)、さまざまなバージョンのドライバーでテストされました。問題が安定して再現されました。Windows 7を使用しています。
では、なぜこのような問題が生じるのでしょうか。それを解決する方法と次に何をすべきか?
UPD1。上の画像が利用できない場合は、いくつかのミラーがあります。
https://dl.dropbox.com/u/20468014/DSC_2287.JPG
https://dl.dropbox.com/u/20468014/DSC_2308.JPG
https://dl.dropbox.com/u/20468014/DSC_2313. JPG
https://dl.dropbox.com/u/20468014/DSC_2319.JPG
UDP2. タイトルバーを非表示にするために、フラグ WS_POPUP を使用してウィンドウを作成していることにも注意してください (非表示にする必要があります)。画像のティアリングがさまざまな場所で発生します。常に画面の上部に表示されますが、20 ピクセルでも 50 ピクセルでもかまいません。そのため、タイトル バー付きのウィンドウを作成しているときに、画像の上部に画像のティアリングが表示されないことがあります。
java - Opengl または Direct3d パイプラインなしで Java2d を使用してスムーズに描画しますか?
opengl および direct3d パイプラインが無効になっている場合 (-Dsun.java2d.d3d=false および -Dsun.java2d.opengl=false で vm を呼び出すことにより)、Java2d を使用してスムーズな動きやアニメーションを取得する方法がわかりません。
以下の簡単で汚いコードは、私の問題を示しています。画面上を移動するボックスを描画します。ボックスの位置は 1 秒間に約 60 回更新され、画面は可能な限り何度も再描画されます。BufferStrategy クラスを使用してダブル バッファリングを実装します。フリップは「bs.show();」で行われます。
コード (エスケープを押して終了):
このコードを「java FluidMovement」で通常どおり実行すると、jvm が direct3d/directdraw パイプラインを使用するため、シルクのようにスムーズに実行されます (時折のテアリングを除く)。このコードを「java -Dsun.java2d.d3d=false -Dsun.java2d.opengl=false FluidMovement」で実行すると、ひどく不安定になります。
direct3d または opengl パイプラインが使用されているとは想定できません。パイプラインは、私が試した 3 台のマシンのうち 2 台では機能しません。Windows 7 を実行している専用のグラフィックスを備えたマシンでのみ機能しました。ボックスをスムーズに動かすことはできますか、それとも JOGL のような低レベル アクセスのライブラリを使用する必要がありますか?
ノート:
- フレームレートは問題ではありません。どちらの場合も (パイプラインが有効な場合と無効な場合)、アプリケーションは 300 fps をはるかに超えて実行されます。パイプラインが有効になっているときに、vsync を強制的にオフにしました。
- Toolkit.getDefaultToolkit().sync() を試しました
- さまざまな種類のループを試しましたが、動きが本当にスムーズではありません。フレームレートを固定しても、同じような途切れが見られます。
- フルスクリーン排他モードでフレームを実行してみました。
- 3 つまたは 4 つのバッファーを使用してみました。
linux - glXSwapIntervalSGI segfault
SDL と openGL を中心に構築されたプログラムで、Linux の垂直同期を無効にしようとしています。Gallium 0.4 をドライバとして使用する古い統合 ATI カードを実行しています。
コードを呼び出して vsync を無効にしようとしましたglXSwapInterval(0)
が、これを行うと、プログラムは正常にコンパイルされますが、実行しようとすると segfault が発生します。
gdb は、かなり役に立たないメッセージを表示します。
誰が何が起こっているのかについて何か考えがありますか?
opengl - OpenGL ウィンドウ システムの画面ティアリング防止
私の OpenGL アプリケーションでは、明らかな理由で画面のティアリングを防止したいと考えています。これまでは vsync を使用していました。しかし、パフォーマンスを向上させるために、ページ フリッピング バッファー スワップ (値を変更する代わりにモニターのデータへのポインターを変更する) に置き換えたいと考えています。私の質問は次のとおりです。重要なウィンドウ システム (Windows、Cocoa、X11) は、この種のバッファー スワップをサポートしていますか? また、明示的に要求する必要がありますか、それともデフォルトの動作ですか?
bitmap - vsync を使用したダブル バッファリング (画面のリフレッシュ レートと同期) - C# Windows フォーム
PictureBox の BMP を毎秒 60 回、更新ごとに変化する線のパターンで更新しようとしています。何が起こっているかというと、画面の更新の間に画像が部分的に更新されています。したがって、あなたが見ているものは、あるパターンの一部であり、次のパターンの一部です. 画面を更新するたびに、正確に 1 回更新する必要があります。理想的には、私の目標はバック バッファーを更新し、それをフロント バッファーにコピーすることです。ゲームで vsync を使用して、画面が更新された直後にのみ画面が更新されるようにフロント バッファーをロックできると聞いたことがあります。このロックを利用できれば、更新ごとに 1 回正確に更新できるようになります。しかし、私はまだそれを行う方法を理解できていません。
何か案は?
Windows フォームで DoubleBuffering = true プロパティを使用してみました。ただし、PictureBox では機能しない場合があります。CopyMemory (ネイティブ dll 呼び出し) を使用して、新しいパターンを PictureBox 内のビットマップにコピーしました。
また、最後の段落で同じ手法で WriteableBitmap を使用しようとしましたが、スタック交換で他の人が提案した方法で行ったにもかかわらず、何らかの理由でバック バッファーがフロント バッファーにコピーされません。これを数時間ほど試しました。その手法では、画面上で画像が更新されることはありませんでした。