2009-04-07 10 views
2

C#GDI +を使用してカスタムコントロールを作成しています。GDI +オフスクリーンバッファスクロール

簡単な説明...コントロールは500ピクセルの画面上に表示されますが、おそらく500000ピクセルの情報が含まれます。だから私は明らかに一度に500pxしか表示していませんが、明らかに水平面内をスクロールする必要があります(左&)。トリッキーな部分は、ビットマップの各500pxチャンクが(100ms〜1000msの間)レンダリングに時間がかかります。

私の計画は、1500pxのビットマップをメモリに保持することです。 500pxの可視部分と500pxの可視領域の両側に配置し、ユーザーがスクロールすると非同期にオフスクリーン部分を描画します。

私はこれを達成するのに役立ついくつかのフィードバック、アドバイス、批評、または例をご希望します。かなり前進しているように見えますが、最初のテストを数回試してみると、想像以上に難しいことが分かります。

ありがとうございました。

+0

しますか?ちらつき?すでにバッファにレンダリングしていて、ペイントイベントでバッファからコントロールにコピーしていますか? – overslacked

+0

はい私は現在、1500pxビットマップを構築してこれをスクロールすることができます。私が抱えている問題は、ユーザーがバッファリングされた領域の端に向かってスクロールしたときに、ビットマップを更新するための最良の方法に実際にはまっています。 – pmcilreavy

+0

私は、必要に応じてスクロールして更新する3つの500pxビットマップを用意して配列することを考えていました。 – pmcilreavy

答えて

1

このアプローチの有効性は、とりわけ、ユーザーの周りを動く量によって決まります。ユーザーが小さな動きをしている場合は、新しい情報を検討するために停止し、これが機能する可能性があります。しかし、ユーザーが揺るがしている場合は、引き続き問題が発生します。

あなたのアプリケーションは、画像の品質を徐々に向上させることに役立ちますか?つまり、すぐに使用できる画像を提供し、ユーザーがそれを考慮しなくても改善することができますか?

+0

残念ながら、コントロールは医療トレンドデータを表示しているため、徐々に品質を向上させることはできません。また、ユーザは、ページングを遅くするだけでなく、かなり迅速に左から右にスクロールすることが可能であり、可能性が高い。 – pmcilreavy

1

私は数年前に同様の問題がありました。 dommerが言及しているように、画像を表示する前に画像の塊を処理している場合は、何かを見せて後で改善するのが最善です。元の画像の合成に問題がある場合は、あなたの方法に間違いがあります。 GDI +は、ピクセルの深さについて非常に特有です(32bppのアルファを使用する必要があります)。

私たちの場合、500pxのタイルで処理し、可視表示の周りにタイルを埋めました。ユーザーが処理した領域の外側をスクロールしました。元画像のビットを濃くした半透明の長方形それらの上に。これらのチャンクは処理のためにキューに入れられました。イメージの塊を処理するとき(センタアウト)、半透明でない四角形が消えます。

非常にうまく動作し、非常に反応が速く、非常に高速でした。元のビットマップを画面にblitするのは非常に高速です。この場合、処理は通常非常に遅れています。タイルの軽量化の効果は、実際にはかなりきれいでした。

+0

私がコード化したコードを細かく切り刻んだとは思わない? – pmcilreavy

1

可視領域のみを描画します。 方法

Bitmap DrawGraph(leftMargin, rightMargin) {...} 

を構築し、その後OnPaint()にあなたが経験している問題はどのような

Bitmap bmp = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height); 
bmp = DrawGraph(e.ClipRectangle.Left, e.ClipRectangle.Right); 

e.Graphics.DrawImageUnscaled(bmp, e.ClipRectangle.Location);