2013-02-22 2 views
3

게임을 만드는 동안 IsRunningSlowly에 대한 GameTime 값이 게임에 포커스가있을 때 false를 반환하지만 응용 프로그램을 변경할 때 true로 변경됩니다. 심지어 빈 게임을 만들었고 포커스를 잃어 버렸을 때에도 IsRunningSlowly의 GameTime 값이 true를 반환합니다. 왜 이런 일을하는지 궁금하네요? 단지 내 컴퓨터일까요, 아니면 XNA 제작자가 이런 방식으로 디자인 했습니까? 프레임 속도는 괜찮은 것처럼 보이지만 그 값은 참입니다. 별거 아니야, 난 정말 호기심이야!포커스가 제거되면 XNA가 느리게 실행 중임

[빈 게임]

public class Game1 : Microsoft.Xna.Framework.Game 
{ 
    #region Constuctors 

    public Game1() 
    { 
     this.GraphicsManager = new Microsoft.Xna.Framework.GraphicsDeviceManager(this); 
     this.Content.RootDirectory = "Content"; 
    } 

    #endregion 
    #region Overrides 

    protected override void LoadContent() 
    { 
     this.SpriteBatch = new Microsoft.Xna.Framework.Graphics.SpriteBatch(this.GraphicsDevice); 
     base.LoadContent(); 
    } 
    protected override void Update(Microsoft.Xna.Framework.GameTime GameTime) 
    { 
     System.Console.WriteLine(GameTime.IsRunningSlowly); 
     Microsoft.Xna.Framework.Input.KeyboardState Keyboard = Microsoft.Xna.Framework.Input.Keyboard.GetState(); 
     if (Keyboard.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Escape)) this.Exit(); 
     base.Update(GameTime); 
    } 
    protected override void Draw(Microsoft.Xna.Framework.GameTime gameTime) 
    { 
     GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.CornflowerBlue); 
     base.Draw(gameTime); 
    } 

    #endregion 
    #region Variables 

    private Microsoft.Xna.Framework.GraphicsDeviceManager GraphicsManager { get; set; } 
    private Microsoft.Xna.Framework.Graphics.SpriteBatch SpriteBatch { get; set; } 

    #endregion 
} 

답변

2

이것은 의도적으로 설계된 동작입니다. 게임은 리소스 소모가 가장 많은 종류의 애플리케이션 중 하나이므로 당연히 XNA 프레임 워크 개발자는 게임에 집중하지 않을 때 일부 프레임을 버려서 원하는 다른 작업을 위해 일부 CPU를 절약하는 것이 좋습니다. 게임은 백그라운드에서 진행됩니다.

XNA 게임도 기본 창을 최소화 할 때 Draw 전화를 걸지 않습니다. 나는 Update 전화가 결코 떨어지지 않을 것이라고 믿습니다.

+0

당신이 이동하거나 창 크기를 조정할 때'Update's을 드롭하는 것 (IsFixedTimeStep가 설정되어있는 기본값) 60 이하로 떨어지면 이후

IsRunningSlowly true로 설정됩니다. (나는 현재이 문제와 씨름하고있다. 아직 100 % 검증하지 않았다.) –

+0

@AndrewRussell 네, 전에 그 기능을 발견했습니다. 게임 창을 이동하고 크기를 조정할 때 게임이 모든 '업데이트'호출을 중단하는 것으로 보입니다. 나에게 큰 문제는 아니지만 미래에는 멀티 플레이어 지원과 연결 시간 제한을 추가하여 안정성을 확보 할 수 있습니다. 내 생각 엔 부모 윈도우가 "크기 조정/이동 중"호출을 하위 게임 창으로 전달하지 않기를 바랄 때 래퍼 애플리케이션에서 게임을 실행하면 (최악의 시나리오)이 반대 할 수 있습니다. 또한 크기 조정 및 이동을위한 게임이 아닌 창을 시도하고 자동으로 맞는 국경없는 (실제) 게임 창 – user1306322

+0

음 - 거의 제가 겪고있는 문제입니다. 네트워크 이벤트 펌핑을 중지하고 네트워크 타이밍을 동기화 해제합니다. 가장 짜증나. Win32의 것 같습니다 ([좋은 설명] (http://www.gamedev.net/topic/488074-win32-message-pump-and-opengl---rendering-pauses-while-draggingresizing/?view=findpost&p= 4189300)). –

7

나는이 질문에 답할 것이고, "이것은 단지 그것이 무엇인지"를 게시하지 않을 것이다. XNA 스레드가 포커스를 잃으면 절전 모드가됩니다. XNA의 게임 클래스에서 구성됩니다.

InactiveSleepTime = new TimeSpan(0); 

기본적으로 20ms로 설정되어 있으며 0으로 설정하면 포커스가 끊긴 상태에서 XNA가 최고 속도로 실행됩니다. 프레임 속도가