2016-04-11 14 views
0

Ich versuche, ein XNA-Spiel (4.0, Visual Studio 2015, .NET 4.0 Framework) zu bekommen Ich schrieb auf einem Computer auf meinem Laptop arbeiten, aber die Leistung sinkt auf 2 in einigen Teilen und geht dann wieder auf 60 in andere (damit meine ich bestimmte bestimmte Spielzustände, die ich aufgezählt habe). Um es klar zu sagen, der Computer, auf dem ich ihn geschrieben habe, funktioniert perfekt und bleibt konstant bei 60 fps, aber der andere Computer bleibt furchtbar zurück.Warum ist mein XNA-Spiel auf einem anderen Computer langsam?

Die Speicher/CPU-Auslastung ist weniger als 25% von beiden, also glaube ich nicht, dass es mit dem Code zu tun hat, aber hier ist, was während der Update-Methode aufgerufen wird, die nur einen leeren Bildschirm läuft:

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

Der Rest ist das Ende einer Switch-Anweisung. Die Methode ist:

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

Und hier ist das, was in der Streck-Verfahren gezogen wird:

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

     spriteBatch.Begin(); 

     switch(state) 
     { 
      case GameState.preTitleScreen: 

       break; 

Nach Abschluss des Verfahrens und der Switch-Anweisung natürlich.

Hat jemand einen Vorschlag, was falsch ist?

Antwort

1

Aufgrund nicht genug Code vorgestellt, muss ich vermuten, was in Frage steht.
Soweit ich weiß, Switch Statements sollte Ihr Spiel nicht zu viel verlangsamen. Was könnte das Problem sein, ist, dass Sie bei jedem "Update" ohne Echtzeitüberlegung aktualisieren. Was ich damit meine:
Sagen wir, Sie haben einen Spieler. In der Update-Methode aktualisieren Sie seine Position (Vector2) um 1 auf der rechten Seite. So wird es in etwa so aussehen:

 

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

Nun, das bedeutet, dass jedes Mal, wenn Ihr Prozessor bekommt Ihr Spiel zu aktualisieren, es 1 zum X der Position des Players hinzufügen. Also, was ist, wenn Sie einen langsamen Prozessor haben? Die 1 in der Formel wird sagen wir 5, und das wird gut "auf Ihrem PC" aussehen. Aber Sie nehmen das Spiel zu einem anderen PC, und es bewegt sich zu schnell, weil der andere PC leistungsfähigeren Prozessor hat und es Ihr Spiel öfter aktualisieren kann. Außerdem werden die fps fallen oder steigen, wenn die Hintergrundprozesse oft beginnen und enden. Das ist, was ich vermute, dass in Frage steht.
Die Lösung für dieses Problem ist einfach. Sie rufen etwas auf, das Ihnen sagt, wie viel Echtzeit seit dem letzten Update vergangen ist. Ihr Code wird jetzt so aussehen und Ihr Player wird sich auf jedem PC um die gleiche Menge nach rechts bewegen.

 

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

Wo ASD präsentiert, wie viele Pixel pro Sekunde
Auf diese Weise zu bewegen, jeder Prozessor die Zeit mit der Menge an Bewegung, die Sie erstellen möchten verstrichene vervielfachen, und wird die genaue Menge zu schaffen, die Sie wollen, auf jedem Prozessor.
Was den Sound betrifft, wird es auf langsamen Computern immer ziemlich langsam sein.