Ist es normal, dass ein Spiel 100% CPU verwendet?

23

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?

Der Lichtfunke
quelle
7
Also, was Sie sagen, Sie haben im Grunde einen Thread mit einer endlosen while-Schleife, die das Betriebssystem ständig nach neuen Ereignissen abfragt? while true do CheckForEvents;
Kromster sagt Unterstützung Monica
5
Wenn eine Anwendung unabhängig von Auslastung und CPU-Geschwindigkeit 100% der CPU-Zeit beansprucht, kann dies zu Recht als Fehler angesehen werden. Sie sollten nicht mehr CPU-Zeit als erforderlich verwenden, um einen Frame pro Monitor-Aktualisierungszyklus zu rendern.
Kasperd
3
@TheLightSpark Schläft der Abfragethread nicht einmal? Wenn Sie ständig in einer Schleife arbeiten und nachsehen, ohne zu schlafen, werden Sie wahrscheinlich viel mehr CPU-Zeit verbrauchen, als erforderlich ist.
Luke
3
Re @Luke: Selbst wenn Sie nur eine Millisekunde zwischen den Umfragen schlafen , wird die CPU-Auslastung drastisch reduziert. Vor einiger Zeit habe ich eine grafische Benutzeroberfläche für ein Befehlszeilentool geschrieben, das eine Eingabedatei und eine Ausgabedatei mit ungefähr derselben Größe erstellt hat. Um den Prozentsatz zu schätzen, habe ich die Dateigröße der Ausgabedatei gelesen und den Fortschrittsbalken aktualisiert (mit while (true)). Benutzte 90% + von einer CPU, um dies zu tun. Durch das Hinzufügen von a wurde Thread.Sleep(5)die CPU-Auslastung auf unter 40% gesenkt. 25 Millisekunden zwischen den Umfragen haben es auf unter 10% gebracht.
Cole Johnson
2
@ AlecTeal Ich denke, Sie haben nicht genug auf das geachtet, was ich gesagt habe. Das Rendern besserer Grafiken ist nicht die gleiche Verwendung, und das Aktivieren besserer Grafiken erhöht natürlich den CPU-Verbrauch. Wenn der Wechsel zu einer schnelleren CPU jedoch dazu führen würde, dass Ihr Code mehr Zyklen benötigt, um genau dasselbe Ergebnis zu erzielen, ist Ihr Code fehlerhaft. Es ist eine vernünftige Standardeinstellung, automatisch zu messen, welche Grafikqualität mit einer bestimmten CPU gerendert werden kann. Sie sollten den Benutzern jedoch die Möglichkeit geben, zu entscheiden, ob sie im Akkubetrieb arbeiten oder eine CPU für Hintergrundjobs benötigen.
Kasperd

Antworten:

41

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.

Kromster sagt Unterstützung Monica
quelle
5
Ich würde diese Frage positiv bewerten, aber dann empfehlen Sie 30 Ticks pro Sekunde. IMHO (und bei vielen anderen Spielern) sollten Sie 60 Ticks (und damit 60 Frames) pro Sekunde anstreben. 60 FPS sehen für viele Menschen flüssiger aus, reagieren reaktionsschneller und verursachen seltener eine bestimmte Teilmenge der Reisekrankheit.
Nzall,
4
33ms Verzögerung für die Eingabe ist sehr auffällig ...
Synxis
1
@NateKerkhofs: Ich komme aus dem RTS-Hintergrund, wo 10 Ticks üblich sind. Es ist eine weite Welt, ich werde Details dazu hinzufügen. Vielen Dank für den Hinweis.
Kromster sagt Unterstützung Monica
1
@KromStern: Ich kann nicht ganz für Nate sprechen, aber der dritte Absatz könnte so interpretiert werden, dass "30 Hz Ihr Ziel sind", obwohl er auch so interpretiert werden könnte, dass "30 Hz das Minimum sind, das Sie tolerieren können" (was möglicherweise das ist, was Sie meinten) ).
Sean Middleditch
1
Die Verwendung von 100% CPU ist eine schreckliche Übung. Sie sind ein Fan von Laptop-Nutzern für Dinge, die in keiner Weise, in keiner Form oder in keiner Form 100% CPU benötigen. Codieren Sie eine richtige Spieleschleife, mit der Frames effizient auf den Monitor übertragen werden können.
Chris Dennett
9

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.

Aracthor
quelle
"Verwenden Sie eine Schlafmethode" - habe ich Recht, wenn ich denke, dass dies als Frameratenbegrenzer bekannt ist?
Gusdor,
3
sleep ist keine genaue Methode zur Framebegrenzung. Wenn das Ziel darin besteht, Frames zur Überwachung der Bildwiederholfrequenz einzuschränken, ist es besser, hardwaregestütztes vsync (oder nvidias g-sync, falls verfügbar) zu verwenden
Sarge Borsch
8

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.

Damian Yerrick
quelle
4
+1 für Stromverbrauch. Zumal Sie die Handy- und Tablet-Branche in Betracht ziehen sollten, wo dies äußerst wichtig ist.
Altar
1
Der Stromverbrauch wirkt sich auch auf Desktops auf das Rauschen aus. Moderne Desktops halten ihre Lüfter häufig langsam und leise, wenn das System kühl ist. Außerdem codiert der Benutzer möglicherweise ein Video (mit niedriger Priorität) während der Wiedergabe, sodass keine zusätzliche CPU-Zeit verschwendet wird. Für zuckende Streaming-Player ist es eine große Sache, mehr Zyklen für die Videokodierung zu belassen, und sie ermöglichen eine höhere Videoqualität. (Die Videokodierung ist ein Drei-Wege-Kompromiss zwischen CPU-Zeit, Bitrate und Qualität. Je länger die CPU-Zeit, desto höher die Qualität der Echtzeitkodierung bei gleicher Bitrate.)
Peter Cordes
1
Stromverbrauch sollte die primäre Überlegung sein, alle anderen Überlegungen sekundären, IMHO. Das einzige, wofür ich 100% CPU verwenden würde (wenn es wirklich geholfen hätte!), Ist VR-Zeug.
Chris Dennett