Ich versuche herauszufinden, wie ich die gesamte Spielschleife in einem Windows-Spiel manuell verwalten kann, ohne die reguläre Game-Klasse Microsoft.Xna.Framework.Game zu verwenden.
Der Grund dafür ist, dass die Verwendung der regulären Game-Klasse zu einem Stottern in meinem Spiel führt. Nicht viel, aber wegen der spezifischen Natur des Spiels ist es immer noch ziemlich sichtbar.
Nach dem Ausprobieren einer Reihe von verschiedenen Einstellungen (vsync, fixedtimestep, verschiedene Frameraten usw.) habe ich beschlossen, zu versuchen, meine eigene Game-Klasse zu schreiben, um die volle Kontrolle über das Timing zu haben. Ich bin nicht sicher, dass das Problem behoben wird, aber zumindest auf diese Weise habe ich die volle Kontrolle.
Im Grunde muss ich das:
- Das Spielfenster einrichten
- In einer Schleife: Alle Rendervorgänge wie üblich durchführen und dann das Ergebnis auf den Bildschirm spülen, Backbuffer verwalten usw.
Weiß jemand, wie man das macht? Es klingt eigentlich ganz einfach, aber ich konnte keine Dokumentation darüber finden, wie es geht.
Nicht sicher, was ich falsch mache, aber ich habe den folgenden Code (nur zum Testen, Timing wird anders gehandhabt werden), und die Schleife wird für eine kleine Weile laufen dann stoppen. Sobald ich meine Mauszeiger über das Fenster übergeben wird die Schleife für eine kleine Weile wieder laufen.
private void Application_Idle(object pSender, EventArgs pEventArgs)
{
Thread.Sleep(500);
//Message message;
//while (!PeekMessage(out message, IntPtr.Zero, 0, 0, 0))
{
gametime.update();
Update(gametime);
Draw(gametime);
GraphicsDevice.Present();
}
}
Wenn Sie "while PeekMessage" aktivieren, läuft die Schleife kontinuierlich, ignoriert aber den Ruhezustand und hält auch an, wenn die Maus über das Fenster bewegt wird. Nicht sicher, was hier los ist...
Ich denke, optimal würde ich nur wollen, etwas einfaches wie dieses in der Haupt-Rendering-Schleife zu tun:
while (alive)
{
Thread.Sleep(100);
gametime.update();
Update(gametime);
Draw(gametime);
GraphicsDevice.Present();
}
In diesem Fall bleibt das Fenster jedoch leer, da es anscheinend nicht tatsächlich mit dem neuen Inhalt neu gezeichnet wird. Ich habe es mit form.Refresh() versucht, aber es geht immer noch nicht... Hat jemand eine Idee?