1

小さな画像を左側から画面、右側に移動しようとしています。

ユーザーコントロールのスタイルを次のように設定しました。

    this.SetStyle(ControlStyles.Opaque, true);
    this.SetStyle(ControlStyles.UserPaint, true);
    this.SetStyle(ControlStyles.ResizeRedraw, true);
    this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

OnPaintハンドラーで、オブジェクトをインスタンスに描画します。これは画面外のバッファーであり、1回の呼び出しを使用しBufferedGraphicsて結果を参照にBitBltします。e.Graphics

だから、私は本ですべてをやったようで、非常に滑らかなちらつきのない描画をしました、そしてそれでも私はオブジェクトが少し途切れているのを見ることができます。

したがって、基本的に2つの可能性が残っています。呼び出しているタイマーが.Invalidate(DirtyRect)一定の間隔で正確に起動せず、オブジェクトが途切れているように見えるか、BitBltが期待どおりに機能しないかのいずれかです。

誰かが何が問題になるのか考えていますか?

更新:考え直してみると、吃音やちらつきというよりは、引き裂くように見えます。オブジェクトが最後の数ピクセルを見逃しているように見えることがあるためです。VSYNCを利用する可能性を検討します。

4

1 に答える 1

1

これはまったく役に立たないかもしれませんが、私は同様の問題を抱えていて、理解するのに永遠にかかったので、それについて言及します. CPUが複数のコアでパフォーマンスカウンターを管理する方法が原因で、タイマーの精度を台無しにするハードウェア固有の問題がありました。

簡単に言うと、コンピューターをアップグレードするまで、メインの OpenGL ループをシングル コアで実行する必要がありました。画面上でグリフを移動する前に次のコード (または類似のコード) を実行すると、同じ問題が発生します。これは c# バージョンです。

Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)1;

これが役立つことを願っています。しかし、これがあなたの問題でないことも願っています。気をつけて。

于 2014-02-07T20:21:16.237 に答える