Optimieren der Framerate
Die Framerate ist die Anzahl der pro Sekunde gerenderten Einzelbilder, der
Frames (Frames pro Sekunde - fps). Sie bestimmt, wie flüssig das Spiel
läuft, und ist von den folgenden Faktoren abhängig:
- Dem Culling-Algorithmus der Engine;
- Der Geschwindigkeit der Video-Treiber und der Graphikkarte,
- Der Anzal an Entities, Polygone und Pixel, die auf den Bildschirm gezeichnet werden;
- Der Komplexität der Szene- Animation, Beleuchtung, Schatten und Shader;
- Der Zeit, die Ihr Skript mit jedem Frame zum laufen braucht;
- Und einer künstlichen Verzögerung zur Synchronisation von Framerate
und Monitor.
Um die Framerate für einen weichen Spieleablauf über 25 fps zu halten, müssen diese Faktoren ausbalanciert sein. Die gute nachricht ist die, dass Sie eine der schnellten Engines am Markt haben. Sie ist in der Lage wirklich große Szenen mit bis zu 100.000 Entities zu managen. Bei einer gegebenen Szene hat die Geschwindigkeit Ihrer Graphikkarte und die Anzahl der per Frame gezeichneten Pixel den größten Einfluß auf die Framerate.Mit dem "grenzenlosen Terrain-Beispiel" (infinite terrain example), das 9 Views mit jeweils etwa 6600 Entities rendert, können Sie die Performance Ihrer Hardware testen. Selbst auf alten PCs sollte die Gesamtsumme von 60.000 Entities mit 20.. 30 fps gerendert werden. Sie können sehen, wie die Framerate nachläßt wenn Sie Reichweite von camera.clip_far erhöhen, so dass in Wirklichkeit mehr Entities gezeichnet werden. Auch wenn Sie die Skalierung der Modelle erhöhen und dadurch mehr Pixel zeichnen, geht die Framerate nach unten. Das sollte Ihnen ein Gefühl dafür geben wie viele Entities Sie bei einer gegebenen Graphik-Hardware in Ihr Game packen können.
Der fps-Anteil bestimmter Elemente lässt sich im [F11]-Panel in ms per Frame einsehen. Manchmal kann dieser grösser sein als die tatsächliche Renderzeit von Engine und Hardware, insbesondere im Fullscreen Modus, in dem die Framerate durch die Bildschirmfrequenz begrenzt wird (meistens 60 Hz bei LCD- und 70..80 Hz bei CRT-Bildschirmen).
Monitorfrequenz und fps
Im Vollbildmodus Modus
synchronisiert DirectX die Framerate mit einer Monitorfrequenz zwischen 60
und 80 Hz, um Tearing-Artifakte zu vermeiden. Die Bildwiederholungsrate wird
künstlich verzögert, damit sie zeitlich darauf passt wenn der Monitor seinen
Videozyklus beendet hat. Diese Verzögerung ist in der "screen refresh"-Zeit im [F11]-Panel zu sehen. Derart werden Sie niemals eine höhere Framerate bekommen
als Ihr Monitor darstellen kann. Ihre Framerate ist ein ganzzahliger Teiler
der Monitorfrequenz. Liegt die Framerate dicht bei der Monitorfrequenz, kann
eine kleine Änderung der Renderzeit dazu führen, dass die Framerate plötzlich
von 30 auf 60 fps springt oder umgekehrt.
Enige Tipps zur Verbesserung der Framerate in Ihren Spielen
- Verwenden Sie kein einzelnes, großes Modell als Level. Wenn die Engine das ganze Level als ein einziges Modell rendert, kann sie ihr Szenenmanagement nicht nutzen und rendert auch die Teile des Levels, die gar nicht sichtbar sind und das führt zu einer schlechten Framerate.
- Wenn Sie das Level in externen Editoren wie etwa MAX, MAYA, oder Blender bearbeiten, verwenden Sie WEDs FBX Level Import , welches das Level automatisch als getrennte Meshes und Modelle importiert.
- Verwenden Sie immer den Mesh Mode zum Kompilieren Ihres Levels. Aktivieren Sie für alle Gruppen, die mehr als etwa 100 Polygone enthalten das Flag Single Mesh. Aktivieren Sie in WED das Flag Single Mesh für alle Gruppen, die etwa 100 Polygone enthalten. Zum automatischen Kombinieren diverser Blocks zu einzelnen Meshes verwenden Sie Mesh Size unter Map Properties . Wenn Sie einen BSP-Tree erstellen wollen, nehmen Sie für alle kleinen Detailblocks, die keine Levelbereiche verdecken das Block-Flag Detail.
- Deaktivieren Sie, wenn Sie sie nicht brauchen, die Maus. Mauserkennung in einem 3D View reduziert die Framerate merklich.
- Verringern Sie die Anzahl gleichzeitig hörbarer Sounds. Einige Sound-Karten ohne Hardware-Mixer reduzieren die Framerate merklich, wenn viele Sounds zugleich abgespielt werden.
- 2D-Funktionen wie draw_textmode
reduzieren merklich die Framerate. Vermeiden Sie solche Funktionen, die im
Handbuch als 'langsam' gekennzeichnet sind.
- Je kleiner der Clipping-Bereich (camera.clip_far), je schneller das Rendering - speziell in Aussenleveln.
- Billige 3D-Karten arbeiten am besten mit Texturgrössen von 256x256.
Je grösser die Textur, je langsamer das Rendering.
- Terrain wird schneller gerendert als Modelle, besonders, wenn es ein Chunk
ist. Verwenden Sie keine Modelle als Terrain.
- Mit heutiger 3D-Hardware bewegt sich die beste Grösse für Modelle im Bereich von 500..5000 Polygonen. Teilen Sie, wenn möglich grössere Modelle in verschiedene Teile auf.
- Beim Konstruieren eines Modells sollte sein Ursprung oder Nullpunkt
so dicht wie möglich an seinem Zentrum liegen. Modelle mit schlecht plaziertem
Nullpunkt
verbrauchen mehr Platz im Szenenmanagement-Baum und verursachen ein langsameres
Rendern.
Ein Modell mit einer einzigen großen Textur rentert schneller als ein Modell mit diversen kleinen Texturen.
- Nicht animierte Modelle werden schneller gerendert als animierte. Für
einen Wald sollte man daher eher unterschiedliche Baum-Modelle verwenden,
als verschiedene Frames eines einzigen Baum-Modells.
Für Sprites gilt das Gegentei: viele Frames desselben Sprites werden schneller gerendert als viele separate Sprites.
- Vertexanimation ist
bei A7 schneller als Bones-Animation (verbraucht aber mehr Speicherplatz).
Wenn der Bones-Animationsshader benutzt wird, ist mit A8 Bones-Animation schneller als Vertex-Animation
- Nicht-transparente oder Overlay-Texturen sind schneller als transparente -oder Alphakanal-Texturen, besonders, wenn Sie viele Entities im Level haben.
- Es ist schneller, die Koordinaten x/y/z eines Objekts direkt zu setzen,
als c_move zu verwenden.
c_move ohne glide
wiederum ist schneller als c_move
mit Gleiten. IGNORE_Flags können c_move und c_trace erheblich beschleundigen. Das Bewegen von UNLIT-Objekten ist schneller als das Bewegen beleuchteter Objekte.
- Verwenden Sie zum Einstellen von Entity-Eigenschaften lieber WED als eine
Entity-Aktion. Ist eine Aktion zum Aufstellen einer Entiy notwendig, setzen
Sie am Ende der Aktion ihren DYNAMIC-emask-Flag.
- Bitmap-Fonts sind schneller als Truetype-Fonts. Truetype-Fonts werden auf
manchen PC-Konfigurationen sehr langsam gerendert.
- Sky-Cubes werden schneller gerendert als Sky-Modelle oder Himmelskuppeln.
- Vertex-Shader werden schneller gerendert als Pixel-Shader. Verschieben Sie so viele Berechnungen wie möglich vom Pixel in den Vertex-Shader.
- Je größer ein Modell oder Sprite skaliert ist und je näher es der Kamera ist, je langsamer wird es gerendert. Die Renderzeit hängt von der Anzahl der Pixel ab, die das Objekt am Bildscirm abdeckt.
- Aus je mehr Polygonen ein Modell besteht, umso langsamer wird es gerendert. Verwenden Sie für sehr große Modelle LOD-Steps, vor allem in Aussenleveln. Interne LOD-Schritte rendern schneller als das Umschalten externer LOD-Modelle.
- Mipmapping erhöht die Framerate. Erstellen Sie für Modelle und
Terrrain-Skins immer Mipmaps - es ist nur ein Mausklick in MED.
- Zu guter letzt: Die A8-Engine ist schneller als die A7-Engine, die schneller als die A6-Engine ist, die schneller als die A5-engine ist. Verwenden Sie immer den neuesten Engineversion.
Einige Tipps, die die Framerate in Ihren Games NICHT erhöhen
Warum in aller Welt sollten Sie die Framerate verringern wollen? Dafür gibt es drei Gründe. Ihre Bewegungsfunktionen könnten nur innerhalb einer bestimmten Framerate korrekt funktionieren und bei 1000 fps danebengehen. Sie wollen nicht, daß Ihre Anwendung sämtliche CPU-Zyklen verbraucht. Und vor allem wollen Sie natürlich ein Ruckeln vermeiden. Ruckeln meint scheinbar 'stotternde' Kamera- und Actorbewegungen trotz bzw. gerade wegen hoher Framerate. Es tritt nicht auf in einem normalen Spiel mit komplexen Leveln und mittlerer Framerate. Jedoch bei Spielen mit fast leeren Leveln und wenig Inhalt wird die Framerate permanent von fps_max begrenzt und führt zu dem berüchtigten Ruckeln.
Der Hauptgrund für das Ruckeln liegt in der geringen Auflösung des Task-Scheduler auf einem PC und daher - vor allem, wenn mehrere Anwendungen gleichzeitig auf einem einzelnen PC laufen - unpräzisen Startzeiten von Tasks. Das Problem läßt sich umgehen, indem man die Framerate nicht nur per fps_max limitiert, was dem Windows Task-Scheduler lediglich Task-Zeit zurückgibt, sondern indem man CPU-Zyklen wirklich auf die eine oder andere Weise 'verbrennt'. Glücklicherweise ist dies einfach zu bewerkstelligen. Falls Ihr Spiel von Ruckeln geplagt wird, setzen Sie einfach ein paar mehr Details in Ihre Level. So vermeiden Sie eine zu hohe Framerate.
► Aktuelle Version Online