2013-04-01 47 views
2

我一直在嘗試用每次更新更改每秒60次的圖片框的BMP格式。正在發生的是在屏幕刷新之間部分更新的圖像。所以,你看到的是一種模式的一部分,另一部分。每次刷新屏幕時,我都需要更新一次。理想情況下,我的目標是更新後臺緩衝區,然後將其複製到前臺緩衝區中。我聽說您可以在遊戲中使用vsync來鎖定前臺緩衝區,以便在屏幕刷新後立即更新屏幕。如果我可以利用這個鎖定,它將允許我每次刷新精確更新一次。但我還沒有弄清楚如何去做。使用vsync雙緩存(與屏幕刷新率同步) - C#窗體

任何想法?

我曾嘗試在Windows窗體中使用DoubleBuffering = true屬性。但它可能無法用於PictureBox。我使用CopyMemory(本地dll調用)將新模式複製到PictureBox中的位圖。

我也嘗試在最後一段使用WriteableBitmap和相同的技術,但由於某種原因,後臺緩衝區永遠不會複製到前臺緩衝區,即使我以其他人在堆棧交換中所建議的方式進行操作。我試了幾個小時左右。該技術從未在屏幕上更新圖像。

回答

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"; 
} 

然後聲明一個全局變量: 布爾_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); 
}