Ich habe ein ganz komisches Verhalten, und zwar versuche ich mich gerade an einem Fahrenden Auto. Ich entwickel gerade an einem (schwachen) Notebook. Wenn ich das Auto + Hintergrund darstelle hab ich nur 30fps. Wenn ich aber das Auto einzelnd, oder nur den Hintergrund darstelle, hab ich 60fps. Woran kann das liegen? Meine Updatemethode ist schnell genug.
Liegt eventuell am VSync. Dein Laptop ist schnell genug, beide Objekte einzeln mit 60 FPS zu rendern. Sofern er aber beide rendern soll, reicht's vielleicht nur noch für 58 fps. Mit aktiviertem VSync werden daraus dann 30.
Möglicherweise kannst Du noch ein wenig Performance durch die Vorkompilierung mit ngen herauskitzeln.
Dazu solltest Du deine Assemblies in den GAC (Global Assembly Cache) kopieren und anschließend mit dem Tool (ngen.exe) vorkompilieren bzw. ins ZAP (Cache für native Assemblies) installieren.
Das Tool findest Du unter (C:\Windows\Microsoft.NET\Framework\v2.0.50727\ngen.exe)
Syntax:
Assembly und alle referenzierten Assemblies kompilieren
ngen install "[Path\assembly.extension]"
Nur Assembly kompilieren
ngen install /NoDependencies "[Path\assembly.extension]"
Assembly aus ZAP deinstallieren (Achtung ohne Dateierweiterung (Displayname))
ngen uninstall "[Path\assembly.extension]"
Alle Assemblies dessen Kompilierungsstatus dirty sind neu kompilieren
ngen update
ngen sollte auf keinen fall grundlage von ausreichender performance sein.
... das behauptet auch keiner!-Dennoch bietet Dir ngen die Möglichkeit Deine Anwendung, selbst wenn sie zu 99,9% performance-optimiert ist, um einen gewissen Prozentsatz zu beschleunigen. Dieser Prozentsatz ist natürlich abhängig vom Betriebssystem(64/32bit),von der Prozessorarchitektur und von der Architektur der Software selbst.
Zitat von JAck30lena
zudem basiert hier fast alles auf directx und somit wäre der gewinn absolut minimal.
Es geht darum das die Update methode angeblich schnell ist, und die Anwendung auf einem "schwachen" laptop ausgeführt wird. Da ist selbst ein minimaler Performancegewinn ein Gewinn.
ngen ist aber nciht für enwicklungsphasen geeignet. beim fertigen produk spricht ncihts dagegen aber während der entwicklung? vor allem im debugmode ist ngen absolut fehl am platz da man ansonsten nciht mal vernünftig debuggen kann.
Hätte da ein paar alte bei mir rumstehen. Wenn du einen Testcode zur Verfügung stellst, könnten wir dir mit Sicherheit mehr Informationen zu kommen lassen.
Es hat sich erledigt. der Laptop war nicht von mir. Es ist ein altes. XP 512mb ram. ein langsamer amd. Lahme Graka. Ich hab es aber jetzt auf 45fps beschleunigt bekommen und hab auf meinem "großen" PC wieder 60fps.Ich zeig drotzdem mal meinen Code her:
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None, cam.GetMatrix (Window.ClientBounds));
spriteBatch.Draw(ground,new Rectangle(0,0,ground.Width,ground.Height),Color.White);
dr.Render(spriteBatch);
spriteBatch.End();
base.Draw(gameTime);
}
Und nochmal in der Klasse driver:
public void Render(SpriteBatch batch)
{
batch.Draw(texture, new Rectangle((int)position.X, (int)position.Y, 50, 300 / 4)
, null, Color.White, rotation, new Vector2(texture.Width / 2, texture.Height / 2),
SpriteEffects.None, 0);
}
Wie man (vieleicht) sehen kann, dreht sich die Kamera jetzt mit.
Liegt eventuell am VSync. Dein Laptop ist schnell genug, beide Objekte einzeln mit 60 FPS zu rendern. Sofern er aber beide rendern soll, reicht's vielleicht nur noch für 58 fps. Mit aktiviertem VSync werden daraus dann 30.
Wie kommst du denn zu der Annahme? VSync halbiert keine Frameraten, sondern passt die Anzeige an den Monitor an (verhindert, dass eine Aktualisierung des Bildes während des Bildausfbaus). Es sind dann lediglich keine Frameraten über der eingestellten Hertzzahl möglich. Ich denke auch, dass es am Notebook liegt, obwohl auch bei einem so alten Gerät nicht so krasse Probleme bei 2 Objekten auftreten sollten.
Evtl. gibts keine Hardwareunterstützung bei dem Laptop. Am fehlenden Speicher wirds wohl eher nicht liegen, mit den zwei Objekten... Es sei denn die Textur ist in 4K-Auflösung oder sowas...
Christian
Weeks of programming can save you hours of planning
Ich hab mal gehört, dass xna immer einen eigenen Pixel und Vertexshader einsetzt. Es kann gut sein, dass der laptop eine graka hat, die die shaderversion von xna nicht unterstützt. Dann wird das mit software emuliert.
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
Ja Floste das stimmt. XNA arbeitet komplett auf Shaderbasis(BasicEffect) und nicht mehr mit der FixedFuntionPipeline. Jedoch wird, wenn die entsprechende Shaderversion(bei XNA 2.0 war es 1.1) nicht von der GraKa bereitgestellt wird, nicht automatisch emuliert. Das muss man explizit beim DeviceType angeben. Standart ist das Hardware und wird folglich eine Exception werfen.
Das muss man explizit beim DeviceType angeben. Standart ist das Hardware und wird folglich eine Exception werfen
Betrachte das ganze nicht nur von C# aus. Wie sieht es mit den GraKa Teiber aus? Es kann durch aus vorkommen, dass dieser einiges emuliert und die CPU damit belastet. Besonders bei Laptops sollte man da genauer hinschauen ;)
XNA 3 benötigt mind. das Shader-Model 2.0 für den BaseEffect. Alle DirectX 9.0 Karten haben erstmals den Shader 2.0 mit an Board, was der Laptop wahrscheinlich auch erfüllen dürfte.
Dennoch sollte man beim Programmstart eine Abfrage einbauen.
Erfüllt dein Gast-System nicht die Anforderungen, dann bekommst du eine NoSuitableGraphicsDeviceException.
Zitat von MSDN
If NoSuitableGraphicsDeviceException does not have an inner exception, it is likely that your graphics card does not have a DirectX 9 driver, that it does not support Shader Model 1.1, or that the hardware acceleration slider is not set to Full in your settings.
Das sind alles nur Vermutungen, und es wäre so einfach, es herauszubekommen (TaskManager, NPerf etc.)
Einfach mal ausprobieren, wo der Flaschenhals beim Programm ist hilft hier weiter.
So ein unglaublich simples Programm sollte auf jedem Laptop laufen, auch wenn es noch so lahm ist.
Christian
Weeks of programming can save you hours of planning