2016-04-11 3 views
0

Я пытаюсь получить игру XNA (4.0, Visual Studio 2015, .NET 4.0 Framework). Я написал на одном компьютере для работы на моем ноутбуке, но производительность падает до 2 в некоторых частях, а затем возвращается к 60 в другие (я имею в виду в некоторых разных GameStates, которые я перечислял). Чтобы быть ясным, компьютер, который я написал на нем, отлично работает и остается постоянным 60 кадров в секунду, но другой компьютер сильно страдает.Почему моя игра XNA медленная на другом компьютере?

Использование памяти/процессора не превышает 25% от их обоих, поэтому я не думаю, что это связано с кодом, тем не менее вот что вызывается во время части метода Update, которая запускает пустой экран:

private void switchGameMode() 
    { 
     switch (state) 
     { 
      case GameState.preTitleScreen: 
       if (playing != paganBackground) 
       { 
        MediaPlayer.Stop(); 
        playing = paganBackground; 
       } 
       MediaPlayer.Stop(); 
       surprisePreTitleScreen(); 
       break; 

Остальное - это конец оператора switch. Метод:

private void surprisePreTitleScreen() 
    { 
     if ((oldpad1.Buttons.Start == ButtonState.Released && pad1.Buttons.Start == ButtonState.Pressed) || (oldkeys.IsKeyUp(Keys.Enter) && keys.IsKeyDown(Keys.Enter))) 
     { 
      jeopardyTitle.Play(); 
      state = GameState.titleScreen; 
     } 
    } 

А вот что втягивается в методе рисования:

protected override void Draw(GameTime gameTime) 
    { 
     GraphicsDevice.Clear(Color.Wheat); 

     spriteBatch.Begin(); 

     switch(state) 
     { 
      case GameState.preTitleScreen: 

       break; 

После завершения метода и переключателя заявление, конечно.

Есть ли у кого-нибудь предложения относительно того, что не так?

ответ

1

Из-за недостатка представленного кода я должен предположить, что находится под вопросом.
Насколько я знаю, переключатель statemenst не должен слишком замедлять игру. Проблема может заключаться в том, что вы обновляете каждое «обновление» без учета в реальном времени. Что я имею в виду:
Допустим, у вас есть игрок. В методе обновления вы обновляете его привязку (Vector2) на 1 справа. Таким образом, это будет выглядеть примерно так:

 

    protected override void Update (GameTime gameTime) 
    { 
     palyer1.Position.X += 1; 
    } 

Теперь, это означает, что каждый раз, когда ваш процессор получает обновить свою игру, это добавит 1 к X позиции вашего игрока. Итак, что, если у вас медленный процессор? 1 в формуле будет говорить 5, и это будет хорошо выглядеть «на вашем ПК». Но вы играете на другой компьютер, и он движется слишком быстро, потому что на другом ПК есть более мощный процессор, и он чаще обновляет вашу игру. Кроме того, fps будет падать или увеличиваться, если фоновая процессия начинается и заканчивается часто. Вот что я предполагаю, что это под вопросом.
Решение этой проблемы прост. Вы вызываете что-то, что говорит вам, сколько времени прошло от последнего обновления. Теперь ваш код будет выглядеть так, и ваш плеер будет перемещаться вправо на одну и ту же сумму на каждом ПК.

 

    protected override void Update (GameTime gameTime) 
    { 
     elapsedTime = (float)gameTime.ElapsedGameTime.TotalSeconds; 
     palyer1.Position.X += elapsedTime * ASD; 
    } 

Где ASD представляет сколько пикселей для перемещения в секунду
Таким образом, каждый процессор будет умножать время, прошедшее с количеством движения вы хотите создать, и создать точную сумму, которую вы хотите, на каждом процессоре.
Что касается звука, он почти всегда будет отставать на медленных компьютерах.

Смежные вопросы