1

カスタム イメージ表示コントロールを作成した C# .NET アプリケーションがあります。各画像表示は独自の表示コンテキストを表し、glDrawPixels を使用して画像を描画します (はい、テクスチャを使用する方が良いことはわかっています。将来的にはそうする予定ですが、このアプリは既に開発が進んでおり、時間が限られています)。

現在、両方の画像を同時にパンしようとしています。つまり、1 つの画像が 10 ピクセル下に移動すると、2 番目の画像は 10 ピクセル下に移動します。そのようです:

imageOne.YPan -= 10;
imageTwo.YPan -= 10;
imageOne.Invalidate(); //This forces a redraw.
imageTwo.Invalidate(); //This forces a redraw.

さて、ここに私が抱えている問題があります。画像表示の 1 つだけが再描画されています。2 つの Invalidate 呼び出しの間に一時停止を置き、一時停止期間を少なくとも 110 ミリ秒にすると、両方が再描画されますが、同時には再描画されません。そのため、2 番目の画像が常に最初の画像に追いつこうとしているように見えます。さらに、110 ミリ秒の一時停止により、モーションが大幅に遅くなります。

各画像の更新と無効化を独自のスレッドに配置しようとしましたが、これは役に立ちませんでした。

描画の開始時に適切なコンテキストを現在の状態にし、最後に swapbuffers() を呼び出しています。draw関数の最後にglFinishを追加してみましたが変わりませんでした。

問題はグラフィックカードではないでしょうか?openGL 1.4 しかない統合 GPU の使用に行き詰まっています。

うまくいけば、私の問題に対する答えが見つかるのに十分な詳細を提供できました。

4

2 に答える 2

1

詳細をほとんど説明していないため、自分の行動の何が問題なのかを判断するのは困難です。ここに役立つかもしれないいくつかのポインタがあります。
- コンテキストで何かを行う前に、それを現在のコンテキストにすることを確認してください。2 つのコンテキストをパンする場合は、最初のコンテキストを現在のコンテキストにしてパンし、次に 2 番目のコンテキストを現在のコンテキストにしてパンします。これらは、これが機能しない本当の理由ではありません。
- タイミングの問題があるように見える場合は、glFinish()戦略的な場所に追加することで問題を取り除くことができます
- いつも行うべきことですが、時々電話glError()して、すべてがうまくいったことを確認してください。
-あなたが話しているフレームワークでこれがどのように行われるかはわかりませんが、両方のコンテキストがswapBuffers()すべてのフレームで呼び出されるようにする必要があります。

于 2008-11-26T02:11:06.823 に答える
0

Invalidate即時再描画を強制しません。ウィンドウが無効であるとマークし、メッセージ キューが他のメッセージを使い果たすと、ペイント メッセージが作成されて処理されます。しかし、現在のメッセージの処理を終了してメインのメッセージ ループに戻るまで、それは起こりません。それ以上の遅延が生じる可能性があります。

一般に、OpenGL アニメーションは、すべての描画を内部 (またはイベントControl.OnPaintのハンドラー)で行うという規則の例外です。Control.Paint

于 2011-04-11T23:23:51.073 に答える