2

PictureBox の BMP を毎秒 60 回、更新ごとに変化する線のパターンで更新しようとしています。何が起こっているかというと、画面の更新の間に画像が部分的に更新されています。したがって、あなたが見ているものは、あるパターンの一部であり、次のパターンの一部です. 画面を更新するたびに、正確に 1 回更新する必要があります。理想的には、私の目標はバック バッファーを更新し、それをフロント バッファーにコピーすることです。ゲームで vsync を使用して、画面が更新された直後にのみ画面が更新されるようにフロント バッファーをロックできると聞いたことがあります。このロックを利用できれば、更新ごとに 1 回正確に更新できるようになります。しかし、私はまだそれを行う方法を理解できていません。

何か案は?

Windows フォームで DoubleBuffering = true プロパティを使用してみました。ただし、PictureBox では機能しない場合があります。CopyMemory (ネイティブ dll 呼び出し) を使用して、新しいパターンを PictureBox 内のビットマップにコピーしました。

また、最後の段落で同じ手法で WriteableBitmap を使用しようとしましたが、スタック交換で他の人が提案した方法で行ったにもかかわらず、何らかの理由でバック バッファーがフロント バッファーにコピーされません。これを数時間ほど試しました。その手法では、画面上で画像が更新されることはありませんでした。

4

1 に答える 1

0

私は自分の質問に対する解決策を見つけました。そのための最善の方法は、XNA 2D アプリケーションを作成することでした。グラフィックカードの設定で vsync を強制しました。次に、XNA アプリケーションでこのプロパティをオンにしました。ゲーム コンストラクターでは、これを使用しました: this.IsFixedTimeStep = true;

public Game1()
{
    this.IsFixedTimeStep = true;
    this.TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 1000 / 60);//60 times per second
    graphics = new GraphicsDeviceManager(this)
    {
        PreferredBackBufferWidth = 800,
        PreferredBackBufferHeight = 600,
        SynchronizeWithVerticalRetrace = true,
    };

    graphics.ApplyChanges();
    Content.RootDirectory = "Content";
}

次に、グローバル変数を宣言します: bool _IsDirty = true; そして、次の関数を宣言します。

protected override bool BeginDraw()
{
    if (_IsDirty)
    {
        _IsDirty = false;
        base.BeginDraw();
        return true;
    }
    else
        return false;
}
protected override void EndDraw()
{
    if (!_IsDirty)
    {
        base.EndDraw();
        _IsDirty = true;
    }
}

protected override void Draw(GameTime gameTime)
{
    //graphics.GraphicsDevice.Clear(Color.Black);

    // Draw the sprite.
    spriteBatch.Begin();
    spriteBatch.Draw(textureImg, new Rectangle(0, 0, 800, 600), Color.White);
    spriteBatch.End();
    base.Draw(gameTime);
}
于 2013-04-02T17:34:05.573 に答える