2010-12-16 4 views
0

ich derzeit an einem Spiel arbeite, in denen wir die Verwendung von DrawUserIndexedPrimitives und normalen spriteBatch.Draw kombinieren müssen. Nicht kombiniert, da wir sie zur gleichen Zeit benutzen, aber wir müssen erst ein paar 2D-Sprites mit spriteBatch zeichnen, nachdem wir spriteBatch deaktiviert haben, um basicEffect zu aktivieren und die Grundelemente zu zeichnen, und endlich wieder spriteBatch aktivieren. Der folgende Code zeigt den Abschnitt des Codes, in dem das Problem auftritt.XNA 4.0 - Verwenden von Spritebatch und basicEffect hinkt

spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, null, null, null, null, cam.get_transformation(GraphicsDevice)); 
       levelController.Draw(spriteBatch); 


       if (gameReady) 
       { 
        foreach (GameObject.GameObject go in gameObjects) 
        { 
         go.Draw(spriteBatch); 
        } 
        spriteBatch.End(); 

        foreach (GameObject.GameObject go in gameObjects) 
        { 
         if (go is GameObject.Enemy.Enemy) 
         { 
          GameObject.Enemy.Enemy enemy = (GameObject.Enemy.Enemy)go; 

          basicEffect = new BasicEffect(graphics.GraphicsDevice); 
          basicEffect.VertexColorEnabled = true; 
          basicEffect.CurrentTechnique.Passes[0].Apply(); 

          GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(PrimitiveType.TriangleList, enemy.GetCollisionTriangle.Triangle, 0, 3, enemy.GetCollisionTriangle.Indices, 0, 1); 
         } 
        } 
       } 

       spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, null, null, null, null, cam.get_transformation(GraphicsDevice)); 

Wenn der unten stehende Code heraus zitiert wird, stoppt die Verzögerung.

basicEffect = new BasicEffect(graphics.GraphicsDevice); 
         basicEffect.VertexColorEnabled = true; 
         basicEffect.CurrentTechnique.Passes[0].Apply(); 

         GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(PrimitiveType.TriangleList, enemy.GetCollisionTriangle.Triangle, 0, 3, enemy.GetCollisionTriangle.Indices, 0, 1) 

Kann es wirklich sein, dass wir beide Spritebatch und basicEffect kann nicht ohne das Spiel verwenden eine Menge hinkt? Es wurde auf 3 verschiedenen Computern getestet, von einem sehr alten Laptop bis hin zu einem brandneuen Gamer PC. Das Spiel ist mit dem auftretenden Lag nicht spielbar.

Antwort

3

Ich denke, Sie sollten die Basiswirkung an anderer Stelle als Ihre Zeichenroutine erstellen. Wenn ich richtig rate, wirst du immer den gleichen Basiseffekt verwenden, also setze es in inizialisieren, da "neu" pro Frame (edit: in einer foreach für jedes Objekt) Performance kosten kann.

+0

Vielen Dank, ich dachte, wir haben das schon ausprobiert, aber ich denke nicht :) – Basic

+1

+1: Nun, da du es erwähnst und ich den Code nochmal durchgesehen habe, macht es keinen Sinn, einen neuen 'BasicEffect' zu erstellen . Schön. –

+3

Der Lag, den Sie sehen, ist der Garbage Collector, der die grundlegenden Effekte, die Sie erstellen, ausführt und bereinigt, und da es sich um Einwegobjekte handelt, muss für jeden, der gesammelt wird, der Finalizer ausgeführt werden. Seien Sie sehr vorsichtig bei der Verwendung von new, um nicht-value-Typen zuzuteilen, während Ihr Spiel läuft. – Empyrean

Verwandte Themen