2013-04-01 3 views
2

모든 업데이트마다 변경되는 라인 패턴으로 초당 60 회 PictureBox의 BMP를 업데이트하려고했습니다. 화면 새로 고침 사이에서 이미지가 부분적으로 업데이트되고 있습니다. 그래서, 당신이 보는 것은 하나의 패턴의 일부이고 다음 패턴의 일부입니다. 모든 화면 새로 고침을 위해 한 번 정확하게 업데이트해야합니다. 이상적으로, 필자의 목표는 백 버퍼를 업데이트 한 다음 프론트 버퍼에 복사하는 것입니다. 게임에서 vsync를 사용하여 화면이 새로 고쳐진 직후에 화면이 업데이트되도록 프런트 버퍼를 잠글 수 있다고 들었습니다. 잠금 기능을 활용할 수 있다면 새로 고침 당 한 번 정확하게 업데이트 할 수 있습니다. 그러나 나는 아직 그것을하는 방법을 알아낼 수 없었다.vsync로 이중 버퍼링 (화면 새로 고침 빈도와 동기화) - C# windows forms

아이디어가 있으십니까?

Windows 양식에서 DoubleBuffering = true 속성을 사용해 보았습니다. 그러나 PictureBox에서는 작동하지 않을 수 있습니다. CopyMemory (네이티브 dll 호출)를 사용하여 새 패턴을 PictureBox에있는 비트 맵에 복사했습니다.

마지막 단락에서 동일한 기술로 WriteableBitmap을 사용하려고했지만 다른 이유로 스택 교환에서 제안한 것처럼 백 버퍼가 프론트 버퍼에 복사되지 않습니다. 나는 이것을 2, 3 시간 정도 시도했다. 이미지가 그 기술로 화면에 업데이트되지 않았습니다.

답변

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