Ich habe gerade eine Multi-Thread-Eingabebearbeitung in meiner Spiel-Engine implementiert, bei der der Code, der das Betriebssystem abfragt, um Eingaben daraus zu sammeln und sie mit einem Zeitstempel zu versehen, sich in einem separaten Thread befindet und jeder Frame im Haupt-Thread die gesammelten Eingaben bis zu einem auffrisst logische Spielzeit. Es funktioniert alles, aber dieses Setup verwendet 100% meiner CPU. Ich habe zwei Kerne und es geht zu 100%, während mein Spiel läuft.
Ich habe bei anderen Spielen nachgefragt, ob sie das auch tun. Zum Beispiel scheinen Skyrim und Doom 3 mit etwas mehr als 60% CPU in Ordnung zu sein.
Ist es akzeptabel für ein Spiel, das Multi-Thread-Input verwendet, um 100% der CPU zu verbrauchen? Wenn nicht, welche Tricks verwenden solche Spiele, um die CPU-Auslastung durch den Eingabethread zu senken?
quelle
while true do CheckForEvents;
while (true)
). Benutzte 90% + von einer CPU, um dies zu tun. Durch das Hinzufügen von a wurdeThread.Sleep(5)
die CPU-Auslastung auf unter 40% gesenkt. 25 Millisekunden zwischen den Umfragen haben es auf unter 10% gebracht.Antworten:
Ja, dies ist normal, wenn ein Echtzeitspiel versucht , mit 100% CPU so schnell und gut wie möglich zu arbeiten. Damit der Spieler so viele Bilder pro Sekunde oder eine gute Physiksimulation oder etwas anderes sieht, wie sein PC bieten kann.
In Ihrem Fall - Nein, dies sieht nach einem ineffizienten Entwurf aus, bei dem ein Thread abgerufen und nach Ereignissen in einer Schleife abgefragt wird (
while true do CheckForEvents;
). Korrigieren Sie mich, wenn ich falsch liege, aber das Betriebssystem fragt die Ereignisse bereits ab. Sie sollten sie nur einmal bei jedem Tick von Ihrem Haupt-Thread aus überprüfen.Die Hauptspielschleife sollte schnell genug sein, um mit mehr als 30 Ticks pro Sekunde zu laufen, was für das Abrufen von Befehlen für viele Spiele ausreicht. Spieler werden keinen Unterschied sehen, wenn seine Befehle zB 0-33ms später ausgeführt werden. Andererseits hätten Sie diesen zusätzlichen CPU-Kern für vorteilhaftere Aufgaben verwenden können, wie VIEL bessere KI oder Physik oder was auch immer.
PS Wie in den Kommentaren angefordert, nehmen Sie die obigen Zahlen nicht blind für alle Arten von Spielen. Während TBS-Spiele nur 1 Tick pro Runde benötigen und RTS-Spiele mit 10 Ticks pro Runde gut funktionieren, benötigen andere Genres wie RaceSims viel mehr. Und natürlich knüpfen Sie keine logischen Ticks an die Framerate, das sind zwei separate Dinge.
quelle
Ein Spiel mit einer ständig aktiven Fensteraktualisierung wird größtenteils im Vollbildmodus ausgeführt und ist das einzige (große) Programm des Computers, das vom Betriebssystem verwaltet wird. Es ist also völlig akzeptabel, 100% der CPU zu nutzen, da nichts anderes es brauchen sollte.
Dies bedeutet jedoch nicht, dass Sie unabhängig von Ihrem Spielstatus immer 100% verwenden müssen. Die meisten Game-Loops verwenden eine Sleep- Methode als Begrenzer für die Framerate, wenn sie das Rendern eines Frames vor dem Limit für die Framerate beendet haben, damit die CPU nicht für nichts verwendet wird.
Dies ist wahrscheinlich, was in Ihren Beispielen passiert: Ihre Maschine ist schneller, als Skyrim oder Doom 3 ausgeführt werden müssen, sodass sie nur das verwenden, was sie benötigen - aber alles, was sie benötigen.
Wie @KromSterm sagte, ruft das Betriebssystem normalerweise bereits Ereignisse für Sie ab, sodass es nicht erforderlich ist, eine Schleife schneller als die des Betriebssystems zu machen. Wenn Sie nur zwei Kerne haben, ist es keine gute Idee, 100% des zweiten nur für die Ereigniserkennung zu verwenden, da die Ausführung von Ereignissen sehr schnell ist, wenn Sie nur Ereignisse in die Hauptaktualisierungsschleife übertragen. Sie sollten versuchen, diesen Core für einen Teil des Hauptthread-Jobs mit einem anderen Thread zu verwenden.
quelle
Das Ziel, die gesamte verfügbare CPU-Zeit in einem PC- oder Mobilspiel zu nutzen, hat einige Nachteile.
Systemanforderungen: Wenn das Spiel auf dem PC spielbar ist, auf dem Sie Ihr Spiel entwickeln, kann es möglicherweise nicht auf einem schwächeren PC gespielt werden, der jemandem gehört, der Ihr Spiel gekauft hat. Durch die Beschränkung der CPU-Auslastung bleibt ein Spiel auf Computern nutzbar, über die wahrscheinlich bereits mehr Benutzer verfügen. Wenn Sie wirklich sehen möchten, ob Sie Ihren Markt einschränken, testen Sie Ihre PC-Spiele und die Ihrer Mitbewerber mit einem abnehmbaren Atom-Gerät wie dem Transformer Book oder testen Sie Ihre mobilen Spiele mit einem kostengünstigen Prepaid-Android-Telefon.
Stromverbrauch: Ein Laptop-Computer entlädt seinen Akku schneller, wenn vier Kerne zu 100 Prozent bei voller Frequenz verwendet werden, als wenn beispielsweise zwei Kerne zu 60 Prozent bei halber Frequenz verwendet werden. Stellen Sie daher sicher, dass Ihr Controller-Abfragethread, AI-Thread, Physikthread und Grafikthread blockiert sind, bis sie wieder ausgeführt werden können. Mit Ausnahme einiger sehr nervöser Genres wie Fighting und Rhythm müssen Sie die Controller nicht schneller als etwa 60 Hz abfragen. Stellen Sie daher Ihren Abfragethread so ein, dass er mit einem 60-Hz-Timer ausgeführt wird.
Variabilität der Physik: Wenn die Physik, die das Gameplay beeinflusst, auf stärkeren Maschinen detaillierter ist, hat dieselbe Spieleraktion auf verschiedenen Maschinen unterschiedliche Ergebnisse. Dies bedeutet, dass der Spieler möglicherweise mit einem stärkeren oder schwächeren Computer betrügen kann. Ids Quake III Arena ist dafür bekannt, dass die Framerate die Sprunghöhe beeinflusst . Um dies zu vermeiden, verwenden viele Spiele einen festen Zeitschritt für die Physik. Dies hat jedoch keine Auswirkungen auf Physik, die nicht mit dem Gameplay verbunden ist, wie Partikel- oder Stoffeffekte oder die Interpolation von Koordinaten zwischen Physik-Frames, um Videos mit einer höheren Framerate als Physik zu rendern. Entwerfen Sie also Ihre Physik mit einer Variante des Model-View-Controllers Architektur, in der wesentliche Dinge (Beschleunigung, Treffererkennung und dergleichen) in das Modell und einstellbare Augenweide in die Ansicht einfließen.
KI-Variabilität: Wenn die KI auf stärkeren Maschinen detaillierter ist, verhalten sich Feinde auf verschiedenen Maschinen unterschiedlich. In einer Go- oder Chess-Implementierung ist der Gegner beispielsweise auf einem schwächeren PC schwächer, und Spieler können betrügen, indem sie das Spiel auf einem schwächeren PC spielen oder Hintergrundprozesse wie Antivirus- oder Video-Transcodierung oder Betriebssystem-Updates ausführen.
quelle