問題タブ [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.
c# - なぜ手動のダブルバッファリングを行う必要があるのですか?
私はC#でゲームに取り組んでいます(2.0または3.5のどちらかはまだ決定されていません)。ゲームは六角形のグリッドを持つマップ上でプレイされます。このマップのUIはダブルバッファリングを使用する必要があることを感謝します(多くのレイヤーがあるため、描画が遅くなります)。スタイルを介してダブルバッファリングを有効にすることも、独自のバッファを作成して自分で処理することもできることを知っています。私がウェブ上で見つけたほとんどの推奨事項は、それを自分で処理することです。なぜだろう?明らかに、これにより、制御ダブルバッファリングに固有の仮定を回避できますが、それらの仮定が何であるかはわかりません。
繰り返しになりますが、コントロールをダブルバッファリングする方法を説明するコードを探しているのではなく、ダブルバッファリングスタイルを使用してCLR / Controlクラスに処理させるのではなく、なぜ自分でビルドするのでしょうか。
c# - Winforms ダブル バッファリング
これをフォームのコンストラクター コードに追加しました。
しかし、コントロールが変更されるたびに(フォームとそのコンポーネントが頻繁に変更される(更新が必要))、コントロールをロードするときにまだ醜いアーティファクトが表示されます。
他に何をする必要がありますか?
c# - Panel をサブクラス化せずに OnPaintBackground を無効にしますか?
Panel をサブクラス化し、OnPaintBackground をオーバーライドせずに、パネルの消去を無効にする方法はありますか?
Panel をサブクラス化せずに、ダブル バッファリング効果を達成しようとしています。これをしようとするのは奇妙なことかもしれないことは理解していますが、少なくともできるかどうか知りたいです。次のコード サンプルは、これを示しています。
これにより、おそらく各ペイント サイクルでパネルが消去されるため、ちらつきが発生します。
windows - IDirect3DDevice9::Presentがvsyncをブロックするときの動作を理解する
私は、ビデオバックバッファに描画されるオブジェクトと、そのオブジェクトが実際に画面に表示されるポイントとの間の時間差を(可能な限り)推定する必要がある科学アプリケーションを開発しています。つまり、WindowsXP+上のDirectXがモニターの垂直更新サイクルをどのように処理するかを示します。
私のビデオルーチンはSDL1.3ライブラリに基づいていると言うことから始めます。その結果、DirectX APIにすぐにアクセスすることはできませんが、必要に応じて変更することができます。DirectXは、フルスクリーンモードでD3DSWAPEFFECT_DISCARD、D3DPRESENT_INTERVAL_ONE、およびBackBufferCount=1で初期化されています。これらは最も重要なパラメーターのようですが、さらに情報が必要な場合は、残りのSDLコードを掘り下げて喜んでいます。
D3DPRESENT_INTERVAL_ONEフラグは、バックバッファーとフロントバッファーがリフレッシュサイクルごとに1回だけスワップされ、リフレッシュの途中では決してスワップされないことを保証します(基本的にvsyncを有効にします)。実際、IDirect3DDevice9 :: Present(私の場合はSDL_RenderPresent)を継続的に呼び出す単純なループがある場合、この関数は2つの更新サイクル(60Hzで16.67ms、100Hzで10msなど)の間のミリ秒数の間ブロックします。 。
これが私の質問です...バックバッファに白い四角を描き、SDL_RenderPresentを呼び出します。これは16.67ミリ秒の間ブロックします(60Hzのリフレッシュを想定)。SDL_RenderPresentの呼び出しが戻ったときに、モニターに表示されている画像の状態について何を結論付けることができますか?私が見ているように、ここに可能性があります:
- 白い四角がモニターに描かれたばかりです。
- 白い四角が描画されようとしています(1ミリ秒未満)。
- 以前のフロントバッファが描画されたばかりです。白い四角が表示されるまでに、さらに更新サイクル(16.67ミリ秒)がかかります(SDL_RenderPresentを再度呼び出すとケース1になります)。
- 前のフロントバッファは最後の16.67ミリ秒で描画されました。次は白い四角ですが、次の更新までの正確な時間は不明です。
私が行ったすべての読み取りから、オプション3に傾いていますが、4に対する保証は見つかりません。私の構成では、Present関数は、 2つの更新サイクルの間に一時停止します。目標はフロントバッファーとバックバッファーを交換することであるため、2番目の呼び出しでこれを実行できる最も早い時点は、モニターが更新された直後です(前のフロントバッファーが描画されたばかりです)。その時点で、白い四角を含むバックバッファーを前面に移動できますが、モニターが実際にバッファーの内容を読み取って表示するまで、(最大で)16.67ミリ秒待機する必要があります。理想的には、前回の更新サイクルが終了するとすぐに関数が戻るはずだと聞きたいです。
DirectXの経験が豊富な人は、このトピックに関する洞察を提供できますか?私の仮定は正しいですか、それとも何かが欠けていますか?これらの仮定は、DirectXをサポートしているシステムに対して常に正しいのでしょうか、それともビデオカード、モニター、またはその他のものに応じてロジックが変わる可能性がありますか?
最後のマイナーな質問として、SDL_RenderPresentを何度も呼び出すループに戻ると、最初の3つまたは4つの呼び出しがすぐに返され、後続のすべての呼び出しが更新サイクルを待機していることに気付きました。D3DPRESENT_INTERVAL_ONE制限が最初の更新の前に単に無視されていると仮定するのは正しいですか(2つ以上のバッファーで行われるある種のキューイングとは対照的です)?
つまり、次のリフレッシュサイクルまでのループが約8msで開始されたとします。この期間中にフロントバッファとバックバッファを4回交換できる可能性があります。その最初の更新が行われるまで、SDL_RenderPresentはすぐに戻ります(技術的には現在フロントバッファーがないため、バックバッファーは2つだけです)が、これらのバッファーの1つが画面に表示されるとすぐにブロックが開始されます。これは有効な説明ですか?
[編集]
以下の回答に基づくと、vsyncとPresentを使用した私のアプローチが機能しないことは明らかです。希望する結果を得る別の方法を見つけたと思うので、誰かが私の考えの誤りを見つけた場合に備えて、または同様の問題に取り組んでいる他の誰かの情報のために、ここに投稿します。
最初のステップは、D3DPRESENT_INTERVAL_ONEを取り除くことです。これにより、vsyncが無効になり、SDL_RenderPresentへの呼び出しがすぐに返されるようになります。次に、IDirect3DDevice9 :: GetRasterStatusを使用して、現在のモニターの状態に関する情報を取得できます。これは、2つのリフレッシュサイクル間の一時停止中にtrueに設定されるブールフィールドと、アクティブなリフレッシュ中の現在のスキャンラインを示す別のフィールドを提供します。これらの2つの情報を使用すると、モニターのステータスを常にポーリングしてCPUを100%消費するループを実行することで、独自の垂直同期ルーチンを実装できます。これは私のニーズには受け入れられます。
バッファリングの問題はまだあります-SDL_RenderPresentを呼び出したときに、画面に描画されるフレームをどのように知ることができますか?これを判断する方法を見つけたと思います。これは、モニター上のどの線が現在描画されているかを知る能力に依存しています。基本的なロジックは次のとおりです。
- 新しい更新サイクルが開始するのを待ちます(一時停止= false、スキャンライン= 0)。
- 次のバックバッファを赤い色で塗りつぶし、Presentを呼び出します。
- スキャンラインが32に達するまで待ちます。
- 次のバックバッファを緑色で塗りつぶし、Presentを呼び出します。
など...デモの実装では、赤、緑、青、そして最後に黒を使用しました。GetRasterStatusが更新ステータスに関する正確な情報を提供し、SDL_RenderPresentが呼び出されるとすぐにフロントバッファとバックバッファが反転する場合にのみ、RGBカラーパターンが表示されるという考え方です。これらの条件のいずれかが満たされない場合、何も表示されないか、色が入れ替わったり重なったりする可能性があります。一方、画面の上部に各フレームの一定のRGBパターンが表示される場合は、次のようになります。描画された画像を直接制御できることを証明します。
私は今日仕事をしているいくつかのコンピューターでこの理論をテストしたことを付け加えなければなりません。ほとんどがパターンを表示しましたが、少なくとも1つは画面全体が赤く塗られていました。いくつかは、カラーバンドが上下にジャンプすることで、バッファの交換に一貫性がないことを示しています。これは通常、古いマシンで発生しました。これは、ハードウェアがテスト目的に適しているかどうかを判断するための優れたキャリブレーションテストだと思います。
delphi - VCL コントロールでダブル バッファを使用する
私のアプリケーションには多くのグラフィックスとビジュアル コンポーネントがあります。
後で、いくつかのコンポーネントを保持するためにパネルを使用したいと思いました(配置が簡単になります)が、同時にパネルには透明なプロパティが必要です(その後、パネルの下にグラフィックを表示できるのは私だけです)
それで、パレットに透明なプロパティを持つパネル「TJVPanel」を見つけたので、それを使用し、transparent = trueに設定しました。整列=右(申し分なく);
すべて問題ありませんが、サイズを変更すると、jvpanel 内のコンポーネントと jvpanel がフリックします
だから私は doublebufferd を検索しましたが、成功しませんでした
誰かがこれの解決策を教えてくれたり、別のコンポーネント
を勧めたりできますか?
java - paint()メソッドがupdate()またはpaint()メソッドを実行しないのはなぜですか?
repaint()を実行したときに、クラスのpaint( )メソッドまたはupdate()メソッドが呼び出されないという問題があります。コードは次のとおりです。
このクラスは次の場所に実装されています。
...これはJFrameに実装されます。
実行したときの出力は次のとおりです。
などなど。また、Canvasに画像が表示されません(そもそも画像が描画されていないことを前提としています)。repaintメソッドを完全にスキップしているようです。デバッグステートメント「Updating...」および「Repainting...」は表示されません。ただし、再描画も実行されているようです。ループは問題なく繰り返されます。repaintメソッドがpaint()またはupdate()メソッドを呼び出さないのはなぜですか?
java - Java:Swingでダブルバッファリングを行う方法は?
編集 2
卑劣なコメントや 1 行の回答が要点を逃すのを防ぐために: IFFはsetDoubleBuffered(true)を呼び出すのと同じくらい簡単です。次に、現在のオフライン バッファにアクセスして、BufferedImage の基になるピクセル データバッファをいじり始めることができるようにするにはどうすればよいですか?
私は実行中のコードを書くのに時間をかけました(これもちょっと楽しそうです)ので、実際に私の質問に答えて(なんてショックです;)、ワンライナーやスナーキーではなく、これがどのように機能しているのかを説明してくれる回答を本当に感謝していますコメント;)
これは、JFrame を横切って正方形をバウンスする実際のコードです。ダブルバッファリングを使用するようにこのコードを変換するために使用できるさまざまな方法について知りたいです。
画面をクリアして正方形を再描画する方法は最も効率的ではないことに注意してください。ただし、これは実際にはこの質問の目的ではありません(ある意味、この例のためには、やや遅い方が良いです)。
基本的に、BufferedImage 内の多くのピクセルを常に変更する必要があり (ある種のアニメーションを使用するため)、画面上の単一バッファリングによる視覚的なアーティファクトを見たくありません。
Icon が BufferedImage をラップする ImageIcon である JLabel があります。その BufferedImage を変更したい。
これがダブルバッファリングされるようにするには、何をする必要がありますか?
「画像2」を描いている最中に「画像1」が表示されるのはなんとなくわかります。しかし、 「image 2」での描画が完了したら、 「image 1」を「image 2」で「すばやく」置き換えるにはどうすればよいですか?
これは、たとえば JLabel の ImageIcon を自分で交換するなど、手動で行うべきことですか?
常に同じ BufferedImage で描画し、JLabel の ImageIcon の BufferedImage でその BufferedImage のピクセルをすばやく「ブリット」する必要がありますか? (いいえ、これをモニターの「垂直空白行」と「同期」する方法がわかりません[またはフラットスクリーンで同等:つまり、モニター自体がリフレッシュする瞬間に干渉せずに「同期」することを意味しますせん断を防ぐために、ピクセル])。
「塗り直し」の注文はどうですか?これらを自分でトリガーすると思いますか?repaint()または他の何かを呼び出す必要があるのはいつですか?
最も重要な要件は、画像のピクセル データ バッファー内のピクセルを直接変更する必要があることです。
編集
これは、フルスクリーンの Java アプリケーションではなく、独自の (やや小さい) ウィンドウで実行される通常の Java アプリケーション用です。
c++ - リモートセッションで実行中、LVS_EX_DOUBLEBUFFER は正しくダブルバッファになりませんか?
LVS_EX_DOUBLEBUFFER
ListView コントロールには、ListView の内容を自動的にダブル バッファリングする拡張スタイル があります。
ローカル セッションとリモート セッション間の変更について通知を受けるために登録し、それに応じてこのフラグを更新する必要がありますか? または、ListView はこれを自動的に行いますか?
winforms - c# 4.0 Winform アプリケーション - サイズ変更または拡大/最小化/サイズ変更時のちらつき
WinForm アプリケーションを .net 3.5 から 4.0 に移行した後、一部のコントロールで不快なちらつきが発生することに気付きました。
- ウィンドウのサイズ変更、特にウィンドウを最小化し、後で最大化/再表示する場合
- 開くときのモーダル ダイアログ フォーム
これはバグではありません。アプリケーションは完全に動作しますが、気になるところです。残念ながら、説明するのも難しいです。
- 複数の更新サイクルが実行されているように見えます
- ダイアログ フォームが開き、2 ~ 3 回ちらつき、その後安定する
- 特に、画像を表示するコントロールは影響を受けます。たとえば、フォームを含むコントロールは、この効果を示しません。
- .net 4 のみ、3.5 では目立たない
一部のコントロールをダブル バッファリングに設定しようとしましたが、成功しませんでした。誰かが同じ状況に気付いたのか、それとも解決策があるのか 疑問に思っています.
おそらく関連しています:
c# - ダブルバッファリングの非長方形の割り当て
でPanelに描画しWindows.Forms
ます。
このようにダブルバッファリングを使用すると、長方形の領域しか割り当てることができません。
そして、円や楕円を描くと、残りのスペースは黒い色で塗りつぶされます。
私が間違っていることや、この問題に対処する方法を理解するのを手伝ってください。
前もって感謝します!:)
this.DoubleBuffered = true
ちらつきを防ごうとしました。無駄です。
Var p
その上に何かを描くためのパネルです。