Es gibt etwas, das ich nie verstanden habe. Wie kann ein großes PC-Spiel wie GTA IV 50% meiner CPU nutzen und mit 60 fps laufen, während eine DX-Demo einer rotierenden Teekanne mit 60 fps satte 30% verbraucht?
Es gibt etwas, das ich nie verstanden habe. Wie kann ein großes PC-Spiel wie GTA IV 50% meiner CPU nutzen und mit 60 fps laufen, während eine DX-Demo einer rotierenden Teekanne mit 60 fps satte 30% verbraucht?
Antworten:
Im Allgemeinen liegt es daran
Eine einfache Optimierung besteht beispielsweise darin, nicht zu versuchen, Dinge zu zeichnen, die nicht sichtbar sind. Stellen Sie sich eine komplexe Szene wie ein Stadtbild aus Grand Theft Auto IV vor . Der Renderer rendert nicht alle Gebäude und Strukturen. Stattdessen wird nur das gerendert, was die Kamera sehen kann. Wenn Sie mit Blick auf die Originalkamera zur Rückseite derselben Gebäude fliegen könnten, würden Sie eine halb gebaute, ausgehöhlte Schalenstruktur sehen. Jeder Punkt, den die Kamera nicht sehen kann, wird nicht gerendert. Da Sie ihn nicht sehen können, müssen Sie nicht versuchen, ihn Ihnen zu zeigen.
Darüber hinaus gibt es optimierte Anweisungen und spezielle Techniken, wenn Sie gegen eine bestimmte Hardware entwickeln, um noch bessere Beschleunigungen zu ermöglichen.
Der andere Teil Ihrer Frage ist, warum eine Demo so viel CPU verbraucht:
... während eine DX-Demo einer rotierenden Teekanne mit 60 fps satte 30% verbraucht?
Demos von Grafik-APIs (wie dxdemo
) greifen häufig auf einen sogenannten Software-Renderer zurück, wenn Ihre Hardware nicht alle Funktionen unterstützt, die für ein hübsches Beispiel erforderlich sind. Diese Funktionen können beispielsweise Schatten, Reflexion, Raytracing, Physik usw. umfassen.
Dies ahmt die Funktion eines Hardware-Geräts mit vollem Funktionsumfang nach, das wahrscheinlich nicht vorhanden ist, um alle Funktionen der API zu demonstrieren. Da die Hardware jedoch nicht vorhanden ist, wird sie stattdessen auf Ihrer CPU ausgeführt. Das ist viel ineffizienter als das Delegieren an eine Grafikkarte - daher Ihre hohe CPU-Auslastung.
Geduld, technische Fähigkeiten und Ausdauer.
Der erste Punkt ist, dass eine DX-Demo in erster Linie eine Lehrhilfe ist, daher dient sie der Klarheit und nicht der Ausführungsgeschwindigkeit.
Es ist ein ziemlich großes Thema, das sich verdichten muss, aber bei der Entwicklung von Spielen geht es in erster Linie darum, Ihre Daten und Ihre Ausführungspfade fast pathologisch zu verstehen.
3D-Spiele sind großartig darin, Ihre Augen auszutricksen. Zum Beispiel gibt es eine Technik, die als Screen Space Ambient Occlusion (SSAO) bezeichnet wird und ein realistischeres Gefühl vermittelt, indem die Teile einer Szene beschattet werden, die sich in der Nähe von Oberflächendiskontinuitäten befinden. Wenn Sie sich die Ecken Ihrer Wand ansehen, werden Sie feststellen, dass sie in den meisten Fällen etwas dunkler als die Zentren erscheinen.
Der gleiche Effekt kann mit Radiosity erzielt werden, das auf einer ziemlich genauen Simulation basiert. Radiosity berücksichtigt auch mehr Effekte von reflektierenden Lichtern usw., ist jedoch rechenintensiv - es handelt sich um eine Raytracing-Technik.
Dies ist nur ein Beispiel. Es gibt Hunderte von Algorithmen für Echtzeit-Computergrafiken, die im Wesentlichen auf guten Näherungswerten basieren und in der Regel viele Annahmen treffen. Beispielsweise muss die räumliche Sortierung sehr sorgfältig ausgewählt werden, abhängig von der Geschwindigkeit, der typischen Position der Kamera sowie dem Ausmaß der Änderungen an der Szenengeometrie.
Diese 'Optimierungen' sind enorm - Sie können einen Algorithmus effizient implementieren und zehnmal schneller ausführen, aber wenn Sie einen intelligenten Algorithmus wählen, der ein ähnliches Ergebnis liefert ("Betrug"), können Sie von O (N ^ 4) zu O ( log (N)).
Die Optimierung der tatsächlichen Implementierung macht Spiele noch effizienter, aber das ist nur eine lineare Optimierung.
Eeeeek!
Ich weiß, dass diese Frage alt ist, aber es ist aufregend, dass niemand VSync erwähnt hat !!! ???
Sie haben die CPU-Auslastung des Spiels mit 60 fps mit der CPU-Auslastung der Teekannen-Demo mit 60 fps verglichen.
Ist es nicht offensichtlich, dass beide (mehr oder weniger) mit genau 60 fps laufen? Das führt zur Antwort ...
Beide Apps laufen mit aktiviertem vsync! Dies bedeutet, dass die Rendering-Framerate auf das "vertikale Leerintervall" Ihres Monitors festgelegt ist. Die Grafikhardware (und / oder der Treiber) wird nur mit max. 60 fps. Bildwiederholfrequenz von 60 fps = 60 Hz (Hz = pro Sekunde). Sie verwenden also wahrscheinlich eine ziemlich alte, flackernde CRT oder ein allgemeines LCD-Display. Auf einer CRT mit 100 Hz werden wahrscheinlich Frameraten von bis zu 100 Hz angezeigt. VSync gilt in ähnlicher Weise auch für LCD-Displays (sie haben normalerweise eine Bildwiederholfrequenz von 60 Hz).
Die Teekannen-Demo läuft also möglicherweise viel effizienter! Wenn 30% der CPU-Zeit verbraucht werden (im Vergleich zu 50% der CPU-Zeit für GTA IV), verbraucht es wahrscheinlich weniger CPU-Zeit pro Frame und wartet nur länger auf das nächste vertikale Leerintervall. Um beide Apps zu vergleichen, sollten Sie vsync deaktivieren und erneut messen (Sie werden für beide Apps viel höhere fps messen).
Manchmal ist es in Ordnung, vsync zu deaktivieren (die meisten Spiele haben eine Option in den Einstellungen). Manchmal sehen Sie "Zerreißen von Artefakten", wenn vsync deaktiviert ist.
Details dazu und warum es verwendet wird, finden Sie unter Wikipedia: http://en.wikipedia.org/wiki/Vsync
Während viele Antworten hier hervorragende Hinweise darauf geben, wie ich stattdessen die einfachere Frage nach dem Warum beantworten werde
Das vielleicht beste Beispiel (sicherlich eines der bekanntesten) ist die Id-Software. Sie erkannten sehr früh in den Tagen von Commander Keen (lange vor 3D), dass sie einen cleveren Weg gefunden hatten, um etwas 1 zu erreichen , auch wenn es sich um moderne Hardware (in diesem Fall eine EGA-Grafikkarte!) Handelte, die grafisch überlegen war die Konkurrenz, dass dies Ihr Spiel hervorheben würde. Dies stimmte, aber sie erkannten weiter, dass sie, anstatt sich selbst neue Spiele und Inhalte einfallen zu lassen, die Technologie lizenzieren und so Einnahmen von anderen erzielen konnten, während sie in der Lage waren, die nächste Generation von Motoren zu entwickeln und damit die Konkurrenz erneut zu überholen .
Die Fähigkeiten dieser Programmierer (gepaart mit Geschäftssinn) haben sie reich gemacht.
Das heißt, es ist nicht unbedingt Geld, das solche Menschen motiviert. Es ist wahrscheinlich genauso der Wunsch zu erreichen, zu erreichen. Das Geld, das sie in den frühen Tagen verdient haben, bedeutet einfach, dass sie jetzt Zeit haben, sich dem zu widmen, was ihnen Spaß macht. Und während viele externe Interessen haben, programmieren fast alle immer noch und versuchen Wege zu finden, um es besser zu machen als die letzte Iteration.
Einfach ausgedrückt hatte die Person, die die Teekannen-Demo geschrieben hat, wahrscheinlich eines oder mehrere der folgenden Probleme:
Das letzte mag hart klingen 2, aber es gibt eindeutig einige, die besser sind als andere, Glockenkurven haben manchmal extreme Enden und sie neigen dazu, von den entsprechenden extremen Enden dessen angezogen zu werden, was mit dieser Fähigkeit gemacht wird.
Die geringeren Ziele dürften tatsächlich der Hauptgrund sein. Das Ziel der Teekannen-Demo war genau das, eine Demo. Aber keine Demo der Programmierer Geschicklichkeit 3 . Es wäre eine Demo einer kleinen Facette eines (großen) Betriebssystems, in diesem Fall DX-Rendering.
Für diejenigen, die sich die Demo ansehen, ist es unerheblich, dass sie viel mehr CPU verbraucht als erforderlich , solange sie gut genug aussieht. Es gäbe keinen Anreiz, Abfälle zu beseitigen, wenn es keinen Begünstigten gäbe. Im Vergleich dazu würde ein Spiel gerne Ersatzzyklen für eine bessere KI, einen besseren Klang, mehr Polygone und mehr Effekte haben.
Aus einigen Gründen
EDIT: Um ein paar Zahlen zu geben
2,8 GHz Athlon-64 mit NV-6800 GPU. Die Ergebnisse sind:
Manchmal ist in einer Szene mehr los als es scheint. Zum Beispiel bedeutet eine rotierende Teekanne mit Tausenden von Scheitelpunkten, Umgebungszuordnung, Bump-Zuordnung und anderen komplexen Pixel-Shadern, die alle gleichzeitig gerendert werden, eine Menge Verarbeitung. Oft sind diese Teekannen-Demos nur dazu gedacht, einen besonderen Effekt zu zeigen. Sie nutzen die GPU möglicherweise auch nicht immer optimal, wenn absolute Leistung nicht das Ziel ist.
In einem Spiel sehen Sie möglicherweise ähnliche Effekte, diese werden jedoch normalerweise kompromittiert ausgeführt, um die Bildrate zu maximieren. Diese Optimierungen erstrecken sich auf alles, was Sie im Spiel sehen. Das Problem lautet: "Wie können wir die spektakulärste und realistischste Szene mit der geringsten Rechenleistung erstellen?" Dies macht Spielprogrammierer zu den besten Optimierern überhaupt.
Bei all den qualifizierten und guten Antworten fehlt immer noch die, die wichtig ist: Der Zähler für die CPU-Auslastung von Windows ist nicht sehr zuverlässig. Ich denke, dass diese einfache Teekannen-Demo nur die Rendering-Funktion in ihrer Leerlaufschleife aufruft und beim Pufferwechsel blockiert.
Jetzt zeigt der Windows-CPU-Auslastungszähler nur an, wie viel CPU-Zeit in jedem Prozess verbracht wird, nicht jedoch, wie diese CPU-Zeit verwendet wird. Versuchen Sie, a hinzuzufügen
Sleep(0);
kurz nach der Rückkehr von der Rendering-Funktion und vergleichen.
Darüber hinaus gibt es vom künstlerischen Standpunkt aus viele, viele Tricks, um Rechenleistung zu sparen. In vielen Spielen, insbesondere in älteren, werden Schatten vorberechnet und direkt in die Texturen der Karte "eingebrannt". Oft versuchten die Künstler, Flugzeuge (zwei Dreiecke) zu verwenden, um Dinge wie Bäume und Spezialeffekte darzustellen, wenn sie größtenteils gleich aussehen würden. Nebel in Spielen ist ein einfacher Weg, um das Rendern weit entfernter Objekte zu vermeiden. Oft haben Spiele mehrere Auflösungen für jedes Objekt für Fern-, Mittel- und Nahansichten.
Der Kern jeder Antwort sollte folgende sein: - Die Transformationen, die 3D-Engines ausführen, werden meist in Additionen und Multiplikationen (lineare Algebra) (keine Verzweigungen oder Sprünge) angegeben. Die Operationen einer Zeichnung eines einzelnen Frames werden häufig so angegeben, dass sie mehrfach sind Die Aufgaben eines solchen Add-Mul können parallel ausgeführt werden. GPU-Kerne sind sehr gute Add-Mul-Kerne, und sie haben Dutzende oder Hunderte von Add-Mull-Kernen.
Die CPU muss nur noch einfache Dinge erledigen - wie KI und andere Spielelogiken.
Wie kann ein großes PC-Spiel wie GTA IV 50% meiner CPU nutzen und mit 60 fps laufen, während eine DX-Demo einer rotierenden Teekanne mit 60 fps satte 30% verbraucht?
Während GTA wahrscheinlich effizienter ist als die DX-Demo, ist die Messung der CPU-Effizienz auf diese Weise im Wesentlichen fehlerhaft. Effizienz kann beispielsweise dadurch definiert werden, wie viel Arbeit Sie pro Zeit erledigen. Ein einfaches Gegenbeispiel: Spawnen Sie einen Thread pro logischer CPU und lassen Sie eine einfache Endlosschleife darauf laufen. Sie erhalten eine CPU-Auslastung von 100%, die jedoch nicht effizient ist, da keine nützliche Arbeit geleistet wird.
Dies führt auch zu einer Antwort: Wie kann ein Spiel effizient sein? Bei der Programmierung von "Great Big Games" wird ein großer Aufwand betrieben, um das Spiel in allen Aspekten zu optimieren (was heutzutage normalerweise auch Multi-Core-Optimierungen umfasst). Bei der DX-Demo geht es nicht darum, schnell zu laufen, sondern Konzepte zu demonstrieren.
Ich denke, Sie sollten sich eher die GPU-Auslastung als die CPU ansehen ... Ich wette, die Grafikkarte ist in GTA IV viel geschäftiger als im Teapot-Beispiel (sie sollte praktisch im Leerlauf sein).
Vielleicht könnten Sie so etwas wie diesen Monitor verwenden, um das zu überprüfen:
http://downloads.guru3d.com/Rivatuner-GPU-Monitor-Vista-Sidebar-Gadget-download-2185.html
Auch die Framerate ist zu berücksichtigen, möglicherweise läuft das Teekannen-Sample mit voller Geschwindigkeit (möglicherweise 1000 fps) und die meisten Spiele sind auf die Aktualisierungsfrequenz des Monitors (ca. 60 fps) beschränkt.
Schauen Sie sich die Antwort auf vsync an. Deshalb laufen sie mit der gleichen Bildrate.
Zweitens ist die CPU in einem Spiel führend. Eine vereinfachte Erklärung ist, dass die Hauptspielschleife nur eine Endlosschleife ist:
while(1) {
update();
render();
}
Selbst wenn Ihr Spiel (oder in diesem Fall die Teekanne) nicht viel bringt, verbrauchen Sie immer noch CPU in Ihrer Schleife.
Die 50% CPU in GTA ist "produktiver" als die 30% in der Demo, da es höchstwahrscheinlich überhaupt nicht viel bringt; Aber die GTA aktualisiert Unmengen von Details. Selbst wenn Sie der Demo ein "Sleep (10)" hinzufügen, wird die CPU wahrscheinlich um eine Tonne reduziert.
Schauen Sie sich zum Schluss die GPU-Nutzung an. Die Demo nimmt wahrscheinlich <1% auf einer modernen Grafikkarte ein, während die GTA während des Spiels wahrscheinlich die Mehrheit übernehmen wird.
Kurz gesagt, Ihre Benchmarks und Messungen sind nicht genau.
Die DX-Teekannen-Demo verwendet nicht 30% der CPU, um nützliche Arbeit zu leisten. Es ist beschäftigt zu warten, weil es nichts anderes zu tun hat.
Nach dem, was ich über die Unreal-Serie weiß, sind einige Konventionen wie die Kapselung gebrochen. Der Code wird je nach Spiel zu Bytecode oder direkt zu Maschinencode kompiliert. Außerdem werden Objekte in Form von Maschen gerendert und verpackt, und Dinge wie Texturen, Beleuchtung und Schatten werden vorberechnet, während dies für eine reine 3D-Animation in Echtzeit erforderlich ist. Wenn das Spiel tatsächlich läuft, gibt es auch einige Optimierungen, z. B. nur die sichtbaren Teile eines Objekts zu rendern und Texturdetails nur aus der Nähe anzuzeigen. Schließlich ist es wahrscheinlich, dass Videospiele so konzipiert sind, dass sie zu einem bestimmten Zeitpunkt das Beste aus einer Plattform herausholen (z. B. Intelx86 MMX / SSE, DirectX, ...).
Ich denke, hier fehlt ein wichtiger Teil der Antwort. Die meisten Antworten sagen Ihnen, dass Sie "Ihre Daten kennen" sollen. Tatsache ist, dass Sie auf die gleiche Weise und mit der gleichen Wichtigkeit auch Ihre:
ABER darüber hinaus könnten Sie mit den aktuellen modernen Computern niemals ein echtes 1080p-Video mit >> 30 ftp abspielen (ein einzelnes 1080p-Bild mit 64 Bit würde 15 000 Ko / 14,9 MB benötigen). Der Grund dafür liegt in der Probenahme / Präzision. Ein Videospiel würde niemals eine doppelte Genauigkeit (64 Bit) für Pixel, Bilder, Daten usw. verwenden, sondern eine geringere benutzerdefinierte Genauigkeit (~ 4-8 Bit) und manchmal eine geringere Genauigkeit, die mit Interpolationstechniken neu skaliert wird, um eine angemessene Berechnung zu ermöglichen Zeit.
Es gibt auch andere Techniken wie das Abschneiden der Daten (sowohl mit OpenGL-Standard als auch mit Software-Implementierung), Datenkomprimierung usw. Beachten Sie auch, dass aktuelle GPUs hinsichtlich der Hardwarefähigkeit> 300-mal schneller sein können als die aktuellen CPUs. Ein guter Programmierer kann jedoch einen 10-20-fachen Faktor erhalten, es sei denn, Ihr Problem ist vollständig optimiert und vollständig parallelisierbar (insbesondere aufgabenparallelisierbar).
Aus Erfahrung kann ich Ihnen sagen, dass Optimierung wie eine Exponentialkurve ist. Um eine optimale Leistung zu erzielen, kann die erforderliche Zeit unglaublich wichtig sein.
Um zur Teekanne zurückzukehren, sollten Sie sehen, wie die Geometrie dargestellt, abgetastet und mit welcher Präzision Vs in GTA 5 in Bezug auf Geometrie / Texturen und vor allem die Details (Präzision, Probenahme usw.) angezeigt wird.