問題タブ [double-buffering]
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 - Linux での Java 2D ページフリッピング
Java 2D アプリケーションを Linux で実行すると、画面のティアリングが発生します。Windows での実行時にティアリングは発生しません。コードの分析にかなりの時間を費やしましたが、まだ原因が見つかりません。私は決して自分のコードに問題があるとは断言できませんが、問題が Linux 上の Java 2D レンダリング パイプラインにある可能性も楽しみにしています。ところで、Java 6 と Java 7 の両方でティアリングが見られることに注意してください。Java 7 で実行すると、XRender パイプラインを有効にするかどうかに関係なく、ティアリングが見られます。
もちろん、 によるダブルバッファリングを使用していBufferStrategyます。呼び出したときに取得するBufferStrategy実装Frame.createBufferStrategy(2)はjava.awt.Component$FlipSubRegionBufferStrategy. さらに、 を呼び出すisPageFlipping()とtrue がBufferStrategy返され、機能を呼び出すと false が返されます。全画面排他モードで実行していませんが、実行しようとしましたが、問題は解決しませんでした。 戻ります(しかし、それは関係ないと思います)。BufferCapabilitiesisFullScreenRequired()BufferCapabilities.getFlipContents()FlipContents.UNDEFINED
ページ フリッピングはおそらくサポートされており、BufferStrategy(ブリッティング戦略ではなく) ページ フリッピングを取得しているため、レンダリング パイプラインがテアリングを引き起こしているとは思いません。しかし、2006 年に Chet Haase によって書かれたメーリング リスト メッセージを見つけました。これは、画面のティアリングの問題に対処するもので、次のように述べています。リフレッシュ アーティファクトにぶつかる BltBufferStrategy です。」
取得しているフリップ戦略が実際にページをめくっていないかどうかを判断するにはどうすればよいですか?
Chet はまた、「BufferStrategy を使用してフルスクリーンを実行することは、これを回避する適切な方法です。プラットフォームと状況に応じて、通常はディスプレイの垂直方向の更新と同期するフリップ戦略を提供します。引き裂かないようにしてください。」
戦略がディスプレイの垂直リフレッシュと同期しているかどうかを確認するにはどうすればよいですか?
(上記で参照した Chet Haase からの完全なメッセージについては、http://www.mail-archive.com/java2d-interest@capra.eng.sun.com/msg03743.htmlを参照してください)
c# - パネルによるダブルバッファリング
フォーム全体のダブル バッファリングは、"AllPaintingInWmPaint"、"UserPaint"、および "DoubleBuffer" ControlStyles の値を "true" ( this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true)) に設定することで実行できます。
しかし、これは System.Windows.Forms.Panel では発生しません。これは、クラスで許可されていないためです。私は 1 つの解決策を見つけました: http://bytes.com/topic/c-sharp/answers/267635-double-buffering-panel-control。私もこれを試しました:Winforms Double Buffering。小さな図面で使用されている場合でも、フォーム全体を 1 つの図面に変換しないため、フォームなどで使用しているカスタム リソースがいくつかあります。そして、2つ目は問題を引き起こすようです。それを行う他の方法はありますか?
フォームのサイズが変更されているときに、パネル上の描画を常に点滅させたくないので、これを求めています。ダブルバッファリングなしでフラッシュを取り除く方法があれば、喜んでお知らせします。
c++ - WM_TIMER アニメーションのちらつき
さて、50ミリ秒の経過時間を持つタイマーを使用して、動くテキストをアニメーション化しています(技術的にはテキスト間のスクロール)。
問題は、よく見るとテキストがちらつくのがわかりますが、ちらつきがないようにしたい..
アニメーションが苦手なのですが、ちらつきを軽減するためにできることはありますか?たぶん、より速い経過時間?それとも、これにタイマーを使用する必要がありますか?
編集:
ダブルバッファリングを実装しようとしましたが、明らかに何かをしています。
これはダブル バッファリングのないコードです。これは問題なく動作しますが、少しちらつきます。
そして、これは私のコードで、ダブルバッファリングを使用しています。
最初のテキストは問題なく印刷されますが、2 番目のテキストは次のようになります。
ダブル バッファリングなしの完全なコードは次のとおりです: http://dl.dropbox.com/u/35314071/ScrollingTextClass.zip
/35314071/ScrollingTextClass2.zip
c - シングルライターマルチリーダースレッドでのバッファの交換
物語
どこかから定期的にデータを収集するライタースレッドがあります(リアルタイムですが、問題ではそれほど重要ではありません)。これらのデータから読み取る多くのリーダーがあります。これに対する通常の解決策は、次のように 2 つのリーダー/ライターのロックと 2 つのバッファーを使用することです。
または
問題
どちらの方法でも、他のロックの取得操作が失敗した場合、スワップは行われず、ライターは以前のデータを上書きします (ライターはリアルタイムであるため、リーダーを待つことができないため)。したがって、この場合、すべてのリーダーはそのフレームを失います。データの。
これは大したことではありませんが、リーダーは私自身のコードであり、短いので、ダブル バッファーを使用すると、この問題は解決されます。問題が発生した場合は、トリプル バッファー (またはそれ以上) にすることができます。
問題は、最小限にしたい遅延です。ケース 1 を想像してください。
**この時点**で、理論的にはbuffer0、次の期間を待つのではなく、リーダーが終了した後にライターだけがスワップを実行できれば、他のリーダーはデータを読み取ることができたはずです。この場合、1 つのリーダーが少し遅れただけで、すべてのリーダーが 1 フレームのデータを見逃していましたが、問題は完全に回避できたはずです。
ケース 2 も同様です。
解決策を混ぜてみたので、ライターは書き込み直後にバッファーのスワップを試み、それができない場合は次のピリオドでウェイクアップした直後に試行します。だから、このようなもの:
遅延の問題はまだ残っています:
再び **この時点** で、すべてのリーダーが を読み始めることができますbuffer0。これは、 が書き込まれてから少し遅れbuffer0ますが、代わりに、ライターの次のピリオドまで待たなければなりません。
質問
問題は、これをどのように処理するかです。希望の周期で正確にライターを実行させたい場合は、RTAI関数を使用してその周期を待つ必要があり、私はそれを行うことができません
これにより、ジッターが発生します。「数回」が「次の期間を待つ」よりも長くなる可能性があるため、ライターはその期間の開始を見逃す可能性があります。
より明確にするために、ここに私がしたいことがあります:
私がすでに見つけたもの
私が理解している限り、バッファーにメモリを割り当て続け、リーダーがそれらを使い果たすまでそれらを解放するread-copy-updateを見つけましたが、これは多くの理由で私には不可能です。1 つは、スレッドがカーネルとユーザー空間の間で共有されることです。次に、RTAI を使用すると、リアルタイム スレッドでメモリを割り当てることができません (スレッドが Linux のシステム コールを呼び出すことになり、リアルタイム性が損なわれるためです!)同じ理由で)
また、より高い頻度でバッファーのスワップを試行する追加のスレッドを用意することも考えましたが、それはあまり良い考えではないように思えます。まず、それ自体がライターと同期する必要があります。次に、これらのライター/リーダーの多くがさまざまな部分で並行して動作しているため、ライターごとに 1 つの余分なスレッドが多すぎるように思われます。すべてのライターに対して 1 つのスレッドというのは、各ライターとの同期に関して非常に複雑に思えます。
java - Java SWT GC、ダブルバッファリングイメージを強制的にフラッシュする方法は?
次のコードがあります。
...下の命令を実行した後:shellGC.drawImage(offScreenImage, 0, 0);shellGCコンポーネントに画像が表示される場合と、表示されない場合があります。たとえばデバッグモードのときなど、プログラムの実行を「遅く」したときにのみ表示されます。しかし、高速で実行すると、表示されません。強制的に表示したり、フラッシュしたり、名前を付けたりしたいのですが、可能ですか?
私が達成したいのは、フレームベースのアニメーションを実装することですが、ダブルバッファで再生したり、停止したり、一時停止した特定の単一フレームのみを表示したりできることを明確にしましょう...
ありがとうございました。
animation - 滑らかな PostScript アニメーション
PostScript でアニメーションをスムーズに実行したいと考えています。何が必要かを確認するために、PostScript に直接切り替えてみましょう。Ghostscript を呼び出し、
これで灰色の四角ができました。
黒のストライプが入っています。次に、そのストライプを白と黒で塗りつぶします。
元の黒いストライプよりも小さい黒と白の長方形のちらつきが表示されます。理想的には、元の灰色の正方形が表示されます。またはほとんど。現在、そのような機能はどこで入手できますか?
サイズ 5 の魔方陣を検索する、より興味深いアニメーション シーケンスを表示するには:
数年前、私はこれらの問題に対処しようとしました。しかし、それは Ghostscript や Xfree には入りませんでした。このページを参照 してください。たぶん、今より良いアイデアがいくつかありますか?
編集:これまでの回答を読んだ後、ここで1つの問題を明確にさせてください。基本的に、この質問には 2 つの独立した問題があります。
アニメーションは言語レベルからどのように見るべきですか? 最良の方法は、各フレームを 1 つのページとして表示することだと思います。インクリメンタルな変更により
copypage、少ない労力で実現できます。悲しいことに、そのセマンティクス はcopypageレベル 1 と 2 にしか存在しません。レベル 3 では、 の意味が にcopypage変わりましたshowpage。私は - 何年も前に - Ghostscript を少し修正してcopypage、目に見えるすべての変更をまたはまで遅らせましたshowpage。このようにしてXCopyArea、変更された領域を含むシングルがサーバー (つまり、ディスプレイ) でローカルに実行されます。説明されているグラフィックスに存在しないアーティファクトを回避するために、ビジュアル表示の実際の変更をどのように同期する必要がありますか? あなたが見ている不規則なちらつきは、PostScript の特権ではありません。適切と思われるシステムでこれをプログラムしてみてください。
さらに編集:
適切な言語レベル、つまりレベル 1 または 2 を取得するには (ghostscript の場合):
編集: このコメントを追加して、新しいポストスクリプトの貢献者を引き付ける可能性があります。
vb.net - VB.NETダブルバッファリング
次のコマンドを使用して、スペースインベーダーゲームのVB.NETGDI+でダブルバッファー機能を動作させようとしています。
しかし、クラスにアタッチされた別の描画ルーチンを使用しているため、機能していないようです。
メインフォームのタイマーからこのルーチンを呼び出します。
エイリアンは正しく描画しますが、画像は非常に途切れ途切れで、ダブルバッファリングは機能していないようです。
何か案は
multithreading - マルチスレッドアプリでダブルバッファリングを同期する方法
2つのスレッドがあります。1つはデータ取得用で、もう1つは表示用です。不必要な同期を避けるため。私は次のようにダブルバッファリング(またはページめくり)を使用します:
- データスレッドはバッファ1を書き込んでいますが、表示スレッドはバッファ2を読み取っています
- バッファの書き込みが完了すると、データスレッドは他のバッファ(バッファ2)に切り替わり、新しいページの書き込みを開始します。
- 読み取りの場合、バッファーが書き込みの途中である場合、表示スレッドは他のバッファーから読み取ります。
実際にはうまく機能しますが、時々(100フレームに1つ)ディスプレイにティアリングが見られます。これは、競合状態がまだ残っていることを意味します。
では、このダブルバッファリングの最小限の(効果的な)同期をどのように実装できますか?疑似アルゴリズムで十分です。
performance - ダブルバッファ画面でのSDL_UpdateRectの正確なタイミングと効果は?
Simple DirectMedia Layerでダブル バッファリングされた画面を使用するSDL_UpdateRect場合、複数の画像をブリットした後に 1 回呼び出すのと、個々の画像をブリットした後に 1 回呼び出すのとのどちらがより効率的SDL_Flipですか? つまり、 はSDL_UpdateRect画面をすぐに更新しますか? それとも、画面が反転したときにどの領域を更新する必要があるかを Simple DirectMedia Layer に伝えるだけですか? 通常、ダブルバッファリングされた画面でどのように使用する必要がありますか?
参考までに の説明ですSDL_UpdateRect。
指定された画面で指定された領域が更新されていることを確認します。四角形は画面の境界内に収まる必要があります (クリッピングは行われません)。
' x '、' y '、' w '、' h ' がすべて 0 の場合、
SDL_UpdateRect画面全体を更新します。
c++ - 黒い背景を描くWin32ダブルバッファリング
C ++でwin32でプロジェクトを実行し、描画中の画像をダブルバッファリングしようとしていますが、正しいビットマップが描画された黒い画面が表示されます。これは、カーソルとともにビットマップをドラッグしてビットマップを描画しない WM_MOUSEMOVE 状態も引き起こしています。ペイントのコードは次のとおりです。paint() は WM_PAINT の下の wndproc で呼び出されます。scroll はスクロール バーの位置で、これまでは使用されていません。