問題タブ [doublebuffered]
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 - Java AWT drawImage 競合状態 - 同期を使用して回避する方法
デバッグと分析に何時間も費やした後、競合状態の原因を特定することができました。それを解決することは別の問題です!
競合状態の動作を確認するために、デバッグ プロセスの途中でビデオを録画しました。それ以来、私は状況の理解を深めてきたので、貧弱なコメントとデバッグ プロセスの一部として実装されたばかげたメカニズムを許してください。
http://screencast.com/t/aTAk1NOVanjR
したがって、状況: サーフェス (つまり、java.awt.Frame または Window) のダブル バッファー実装があり、実質的に継続的にループし、レンダリング プロセス (UI レイアウトを実行してバックバッファーにレンダリングする) を呼び出す進行中のスレッドがあります。 ) そして、レンダリング後、レンダリングされた領域をバックバッファからスクリーンにブリットします。
ダブル バッファリングされたレンダリングの疑似コード バージョン ( Surface.javaのフル バージョン 824 行目) は次のとおりです。
他の AWT サーフェス実装と同様に、(AWT.java の 507 行目 -リンク制限 :( - Surface.java リンクを使用し、core/Surface.java を plat/AWT.java に置き換えます) ペイント/更新オーバーライドも実装します。バックバッファからスクリーンへ:
ブリッティングは drawImage() 関数を使用して実装されています (AWT.java の 371 行目)。
(警告: ここから推測を始めます!)
ここでの問題は、drawImage が非同期であり、ペイント/更新を介した refreshBackBuffer() からのブリットが最初に呼び出され、2 番目に発生することです。
つまり... blit は既に同期されています。競合状態を防ぐ明白な方法は機能しません。:(
これまでのところ、2 つの解決策を思いつきましたが、どちらも理想的ではありません。
次のレンダー パスで再ブリットする
短所: パフォーマンス ヒット、競合状態 (有効な画面 -> 無効な画面 -> 有効な画面) が発生したときにちらつきが発生するペイント/更新時にブリットしないでください。代わりに、リフレッシュ境界を設定し、次のレンダー パスでそれらの境界を使用します
。
ここで (1) は 2 つの悪の小さい方のようです。 編集: (2) 機能せず、空白の画面が表示されます... (1) 正常に機能しますが、潜在的にまだ存在する問題を隠しているだけです。
私が望んでいるのは、同期とその使用方法についての私の理解が不十分なために思い浮かびそうにないことですが、drawImage() の非同期の性質をどうにかして説明するロック メカニズムです。
それとも、ImageObserver を使用しますか?
アプリケーションの性質上 (Vexi、興味のある方のために、ウェブサイトは古く、2 つのハイパーリンクしか使用できません)、レンダリング スレッドはペイント/更新の外にある必要があることに注意してください。単一スレッドのスクリプト モデルがあり、レイアウト プロセス (レンダリングのサブプロセス) は、スクリプトを呼び出します。
c# - DrawReversibleLine() とダブル バッファリング
私はcurstomダブルバッファリングを使用していて、でラバーバンドラインを描きたいDrawReversibleLine()
. しかし、これはどのように行うことができますか?このメソッドは画面に直接描画するため、バックグラウンド バッファーに描画する方法がわかりません。あなたならどうしますか?
c# - Compact Framework でのカスタム コントロールのダブル バッファ
から継承するカスタム コントロールがありPanel
ます。このパネルにいくつかの DataGrid と Label を配置することになります。長くなりすぎると、自動スクロールします。
スキャンされたオブジェクトのリストが画面上のスペースを超えて大きくなるため、スクロールが本当に必要です。
しかし、スクロールするとかなりちらつきます。スムーズなスクロールができるようにしたいと思います。
「Compact Framework」のダブル バッファの例をいくつか見てきましたが、それらはすべてダブル バッファリングの描画メソッド (つまりgraphics.DrawString
) です。私のカスタム コントロールは、単独では描画を行いません。通常のグリッドとラベルをパネルに配置し、パネルにそれらをペイントさせます。
通常のコントロールをダブル バッファリングする方法はありますか (これもカスタム ペイントではありません)。
c# - C#、WinFormsのダブルバッファ?
DoubleBuffered を true に設定していると思っても、画像はまだちらつきます。私が間違っていることは何ですか?ありがとう!
c# - スクロール可能な画像ボックスc#.netは、ダブルバッファリングを使用してちらつきを停止します
このリンクを参照して、スクロール可能な画像ボックスを作成します。
正常に動作します。しかし、スクロールすると画像がちらつきます。
WindowsフォームにはDoubleBufferedプロパティがあります。しかし、pictureboxはそうではありません。ピクチャーボックスでDoubleBufferedを使用できれば、問題は解決するかもしれません。
この問題を克服するのを手伝ってください
ありがとうよはん
scroll - スクロール中に wxListCtrl のちらつきをなくすにはどうすればよいですか?
wxWidgets アプリケーション内で wxListCtrl を使用していますが、項目の大きなリストをすばやくスクロールするときに発生するちらつきを解消できないようです (たとえば、「ページダウン」キーを押したままにします)。リストコントロールは virtual/ として作成されます。レポートのリストで、現在 Win7 でテストしています。
テキスト/境界線が正しく表示されるために必要なため、単純にオーバーライドすることはできませんが、背景のクリアがちらつきを引き起こしているようです。
私が必要としているのは、バックグラウンドがクリアされ、アイテムが(オフスクリーンで)描画されるまで、リストが視覚的に更新されないダブルバッファリングを行う方法だと思います。それとももっと良い方法がありますか?
どうもありがとう...
delphi - TPaintBoxの右端のちらつきをなくす方法(サイズ変更時など)
要約:
TFormと2つのパネルがあるとします。パネルはalTopとalClientに配置されます。alClientパネルにはTPaintBoxが含まれており、そのOnPaintには描画コードが含まれます。
コンポーネントのDoubleBufferedのデフォルト値はfalseです。
描画プロセス中、フォーム、パネルはすべて背景をペイントするため、ちらつきは明らかです。
フォームはパネルで覆われているため、WM_ERASEBKGNDメッセージを傍受することはおそらく問題ありません。そうでない場合は、フォームが背景をペイントするため、フォームのサイズが変更されると、パネルでちらつきが見られ、パネルの右端でちらつきが見られます。
次に、alTopパネルは一部のボタンのコンテナとして使用することを目的としているため、DoubleBufferedをtrueに設定して、Delphiにちらつきがないことを確認するのはおそらく問題ありません。おそらくパフォーマンスの負担はそれほど大きくないでしょう。
第3に、alClientパネルは別の図面コンポーネントのコンテナとしてのみ意図されているため、このパネルは最終的な図面の作成に関与していない可能性があります。この点で、標準のTPanelの代わりにTPanelの子孫を使用するのはおそらく良いことです。このTPanelの子孫では、保護されたプロシージャPaintをオーバーライドし、プロシージャ内では何もしません。特に、基本クラスTCustomPanel.PaintのFillRect呼び出しを回避するために、継承された呼び出しは行いません。さらに、WM_ERASEBKGNDメッセージを傍受し、内部では何もしません。これは、TPanel.ParentBackgroundがFalseの場合、Delphiが背景の再描画を担当し、Trueの場合、ThemeServiceが担当するためです。
最後に、TPaintBoxでちらつきなしでペイントするには、次のようにします。
(1)VCL組み込みの描画ルーチンを使用する場合は、おそらく次の方が適切です...
(2)OpenGLを使用し、OpenGLのダブルバッファを有効にします。
(3)..。
=== Q:TPaintBoxの右端のちらつきをなくす方法は?===
1つのTFormに対して、2つのパネルがあるとします。一番上のものはフォームに対してalTopに配置され、ボタンのコンテナと見なされます。もう1つは、フォームに対してalClientに配置され、描画コンポーネント(VCLのTPaintBoxやGraphics32のTPaintBox32など)のコンテナーと見なされます。後者のパネルでは、そのWM_ERASEBKGNDメッセージが傍受されます。
ここで、次のサンプルコードでTPaintBoxインスタンスを使用します。OnPaintハンドラーでは、ちらつきがないと予想される描画を描画するための2つの選択肢があります。選択肢1は、長方形を埋めた後に描画します。親パネルは背景を消去してはならないため、描画はちらつきがないようにする必要があります。選択肢2はTBitmapに描画し、そのCanvasはペイントボックスにコピーされます。
ただし、両方の選択肢がちらつき、2番目の選択肢が特にちらつきます。私の主な関心事は選択1に関するものです。フォームのサイズを変更すると、ちらつきの主要部分が右端で発生していることがわかります。なぜこれが起こるのですか?誰かが理由と可能な解決策についてコメントするのを手伝ってもらえますか?(ここでTPaintBoxの代わりにTPaintBox32を使用すると、右端がまったくちらつきません。)
私の2番目の懸念は、選択肢1を使用すると、ちらつきのごく一部がペイントボックスでランダムに発生することです。あまり明白ではありませんが、フォームのサイズをすばやく変更すると、それでも観察できます。さらに、選択肢2を使用すると、この種のちらつきはさらに深刻になります。その理由はわかりませんでした。考えられる理由と解決策について誰かがコメントするのを手伝ってもらえますか?
どんな提案でも大歓迎です!!
=== Q:パネルの背景の再描画を正しくインターセプトするにはどうすればよいですか?===
(別の質問でこれを尋ねる必要がある場合は、そのように言ってください。これを削除します。)
新しいVCLアプリケーションを作成し、サンプルコードを貼り付け、FormCreateをアタッチし、デバッグを実行します。フォームの上にマウスを置くと、パネルが背景をはっきりと塗り直していることがわかります。ただし、サンプルコードに示されているように、WM_ERASEBKGNDメッセージをインターセプトすることで、この動作をインターセプトする必要があります。
この3行をコメントアウトすると、
次に、WM_ERASEBKGNDメッセージをキャプチャできます。この違いについてはわかりません。
この動作の理由と、WM_ERASEBKGNDメッセージを正しくインターセプトする方法(ParentBackground:= Falseの場合)についてコメントするのに役立つ人がいますか?
java - 更新メソッドのオーバーライドを使用する Java ダブル バッファがスタック オーバーフローをスローする
JPanel の更新メソッドをオーバーライドして、Java でゲームのダブル バッファリングを実現しようとしています。通常のコードなどをすべて実行しても機能しません。スタック オーバーフロー エラーがスローされます。具体的なエラーは次のとおりです。
私のコードも特に複雑ではありません:
私は誰かが私が間違っていた場所を指摘できることを望んでいました.更新が何度も呼び出されていることに関係があるのではないかと考えています.更新が間違った方法である可能性がありますか?
c - ダブルバッファ設計のI/O同期
データをゆっくりと生成するが、それをすばやく消費するアプリケーションがある場合、それはダブルバッファー実装の良い候補になりますか?基本的な考え方は、コンシューマーがフロントバッファーを処理している間に、プロデューサーにバックバッファーを埋めさせることです。クライアントがデータを待機しているように見せたくありません。生産と消費のバランスを取りたい。この機能を実現するにはどうすればよいですか?バックバッファスレッドがある場合でも、フロントバッファが新しいデータ(バッファが交換された)があることを認識できるように、フロントバッファスレッドと同期する必要があります。バックバッファスレッドがデータの生成に時間がかかりすぎる場合、フロントバッファはデータの処理を待機する必要があります。
c# - ダブルバッファリング制御によりグレーが表示される
を受け入れ、Control
生成された画像をそれに描画するクラスがあります。私のアプリケーション コードでは、Panel
これにコントロールを使用しています。これは、イメージが再描画されるときにコントロールで多くのちらつきが発生することを除けば、うまく機能しているようです。解決策は、コントロールでダブルバッファリングを有効にすることだと思います。私は次のコードでこれをやっています:
このコードを追加すると、画像が描画され、すぐにデフォルトの灰色のボタンの背景色に置き換えられます。まるでシステムが自分のコンテンツの上に描画しているかのようです。
コントロールを描画しないようにシステムに指示するプロパティをどこかで見たのを覚えています (コントロール全体をコンテンツで埋めているので、これは私にとって完璧です) が、今は見つかりません。そのようなプロパティはありますか? もしそうなら、どうすれば有効にできますか?
.NET フレームワーク バージョン 4.0 で C# を使用しています。