Stepmania und die ultimative Präzision: LINUX

DDR / ITG am PC mit StepMania etc.

Moderator: Moderatoren

Antworten
Scorpion
Resident
Beiträge: 403
Registriert: Do 24. Jun 2004, 23:00
Wohnort: Köln

Stepmania und die ultimative Präzision: LINUX

Beitrag von Scorpion »

Irgendwann musste es ja kommen..
Obwohl ich mit der Leistung von Windows schon zufrieden war, dachte ich mir probier ich Linux aus und schau obs besser ist. Nach 3 Tagen harter Arbeit (ahh ist linux kompliziert, besonders für Windows Verwöhnte wie mich ^^) lief es dann auch endlich und ich war begeistert. Wie auch bei dem Unterschied Xbox Controlbox - Playstation Adapter (ok nicht ganz so viel..) merkt man einen großen Unterschied sowohl in Offset als auch in Sachen Präzision. Besonders die Präzision ist um einiges besser, die Bewertungen fühlen sich viel zuverlässiger an.
Den Offset Unterschied merkte ich am Besten am Vergleich DDR - In the Groove. ITG spiele ich um Gegensatz zu DDR auf 1.5x Speedmod (=mehr visueller Lag bei Windows) und habe mich immernoch nicht richtig an das andere Spielgefühl gewohnt, bei DDR ging das gewöhnen viel schneller.
Ich frag mich ob jetzt überhaupt noch mehr als 1-2ms Lag vorhanden ist 8O

Um euch die Installation von Linux so weit wie möglich zu vereinfachen, liste ich hier auf was ich in Erfahrung gebracht hab für die Konfiguration und ein bisschen Tuning für Stepmania unter Linux:



Der Kernel:
Man kommt nicht drum herum einen neuen Kernel zu kompilieren. Ab dem Kernel Ver .2.6.12.x sind mousepolling und sogenannte preemptive Patches in den Kernel integriert worden. Mit Hilfe des Mousepolling Parameters kann man die Abfragerate seiner USB Maus erhöhren, die preemptive Patches machen den Kernel von der Reaktion auf Anfragen schneller und zuverlässiger und somit ideal für Stepmania.

Anleitung:
Ein hervorragendes Tutorial über das Kompilieren von Kerneln, dass wirklich keine Fragen offen lässt, findet ihr hier:
http://www.thomashertweck.de/kernel26_print.html

Vergesst auf keinen Fall den preemptive patch in der kernelconfig zu aktivieren!
Bevor ihr die Module kompiliert, müsst ihr noch zwei paar Dateien verändern:

1: /usr/srckernel/drivers/usb/input/hid-core.c
Öffnet die Datei und sucht nach "change the polling interval of mice". Ihr solltet eine Kommentarzeile mit diesem Inhalt vorfinden und dadrunter zwei Zeilen, wobei eine mit "if..." und die andere mit "interval = ..." beginnt.
Löscht die komplette if-Zeile und schreibt bei der anderen Zeile "interval = 2". Damit werden alle USB Geräte automatisch alle 2ms abgefragt=500Hz. Man kann natürlich auch interval=1 setzen.
Hinweis:
In der if-zeile steht, dass der Paramter für interval gesetzt werden soll, wenn das USB Gerät eine Maus ist. Man kann das ganze auch sicherlich noch so einstellen, dass lediglich das benötigte Eingaberät mit einer erhöhten Taktrate abgefragt wird. Allerdings hab ich nicht herausgefunden, ob die Xbox Controlbox jetzt als Gamepad, Joystick oder multi axis controller erkannt wird. Man kann leider mit keinem Programm testen, ob das Gerät jetzt wirklich mit 500Hz läuft, deswegen bin ich lieber auf Nummer sicher gegangen.


2: usr/src/kernel/drivers/usb/input/xpad.c
xpad ist der Treiber für unsere altbewährte Xbox Controlbox. Um das Achsenproblem zu beseitigen, muss dieser aber leicht verändert werden..

1.Sucht nach der Zeile "BTN_START, BTN_BACK, BTN_THUMBL, BTN_THUMBR, /* start/back/sticks */"
und fügt darunter diese ein:
BTN_0, BTN_1, BTN_2, BTN_3, /* left,right,up,down */

2. Sucht nach den Zeilen
input_report_abs(dev, ABS_HAT0X, !!(data[2] & 0x08) - !!(data[2] & 0x04));
input_report_abs(dev, ABS_HAT0Y, !!(data[2] & 0x02) - !!(data[2] & 0x01));
löscht diese und fügt
input_report_key(dev, BTN_0, (data[2] & 0x04) >> 2); // left
input_report_key(dev, BTN_1, (data[2] & 0x08) >> 3); // right
input_report_key(dev, BTN_2, (data[2] & 0x01)); // up
input_report_key(dev, BTN_3, (data[2] & 0x02) >> 1); // down
ein.

Das waren die Änderungen am Kernel.


Stepmania:
RC2 hat bei mir direkt problemlos funktioniert (hab Mandrake 10.2), RC3 brachte einige Probleme mit sich. Ich hab die Hintergrundmovies unter RC3 immernoch nicht zum Laufen gebracht, aber ich glaube mal das ist nicht ganz so tragisch. Außerdem haben ATI User noch ein Problem, da der Treiber unter Linux Müll ist und vsync nicht funktioniert. Wenn vsync nicht aktiviert ist, bekommt ihr je nach System schonmal gut 200-600FPS.
Damit RC3 überhaupt läuft, braucht ihr die libs..
- Lua: luacheia.lua-users.org/
- ffmpeg aka libavcodec: http://sourceforge.net/project/showfile ... p_id=16082

und unter Umständen noch andere, aber ich brauchte nur die beiden.

libs werden immer auf die gleiche weise installiert: Geht ins Verzeichnis der extrahieren lib, und gebt nacheinander 3 Befehle ein:
./configure
make
make install
Außerdem steht in den zugefügten Readmes meistens noch eine Installationsanweisung und eine Info, wo die erstellten Daten hinkopiert werden.


Bei mir wurden alle libs immer in /usr/local/lib installiert, aber Stepmania sucht nach den Libs in /usr/libs. Deswegen musste ich die installierten Libs immer wieder dahin verlinken.
Weiterhin wurden zB von liblua die Datei liblua.so.0 erstellt, Stepmania sucht aber nach liblua.so. Dafür musste ich auch nochmal einen Link erstellen.
Falls ihr Stepmania einfach nicht zum starten kriegt, öffnet es mit einer Konsole und ihr bekommt eine Fehlermeldung welche Datei genau gesucht wird.

Nun zum Vsync Problem..
Besorgt euch den SM RC3 sourcecode. Damit ihr ihn kompilieren könnt, braucht ihr folgende libs:
-mesalib (enthält die GLU library): http://sourceforge.net/project/showfile ... ge_id=2436
-automake(am besten die neueste der 1.7er Versionen) http://ftp.gnu.org/gnu/automake/
wichtig: Stepmania erwartet die dateien der lib in usr/share/automake-1.7.
-autoconf: http://ftp.gnu.org/gnu/autoconf/
-SDL: http://www.libsdl.org/release/SDL-1.2.9.tar.gz

Nun öffnet die Datei sm/src/RageDisplay_OGL.cpp
Sucht nach "void RageDisplay_OGL::EndFrame()"
Kurz darunter müsste der Befehl ProcessStatsOnFlip(); sein.
Gebt darunter folgende Zeile ein:
usleep(PREFSMAN->m_WaitForFrame);
usleep ist eine Zeitangabe in Mikrosekunden, die Stepmania anweist eine gewisse Zeit zu warten, bis der nächste Frame angezeigt werden soll. Damit lassen sich die FPS in Grenzen halten. Statt PREFSMAN->m_WaitForFrame kann man auch direkt einen Wert eingeben. Aber da man mit dem Wert für ein gutes Ergebnis erstmal ein bisschen experimentieren muss, wollen wir, dass man den Wert in der Stepmania.ini verändern kann.

Öffnet dazu die Datei PrefsManager.cpp im selben Verzeichnis.
Sucht nach
"m_fConstantUpdateDeltaSeconds = 0;".
Fügt darunte die Zeile
m_WaitForFrame = 0;
ein.
Sucht nach
ini.GetValue( "Options", "ConstantUpdateDeltaSeconds", m_fConstantUpdateDeltaSeconds );
Fügt darunter die Zeile
ini.GetValue( "Options", "WaitForFrame", m_WaitForFrame );
ein.
Sucht nach
ini.SetValue( "Options", "ConstantUpdateDeltaSeconds", m_fConstantUpdateDeltaSeconds );
gebt darunter die Zeile
ini.SetValue( "Options", "WaitForFrame", m_WaitForFrame );
ein.


Öffnet die Datei PrefsManager.h.
Sucht nach
float m_fConstantUpdateDeltaSeconds; // 0 to disable
fügt darunter die Zeile
int m_WaitForFrame;
ein.

Nun könnt ihr die src so kompilieren wie auch die libs. die datei wird in /usr/local/bin installiert. Ihr müsst sie von da aus in euren Stepmania Ordner kopieren.
Mit der Variable WaitForFrame in der Stepmania.ini könnt ihr die FPS nun begrenzen. Realistische Werte sind 3000-10000, je nach Computer. Höhere Werte bedeuten weniger FPS. Am besten sollten die FPS wie bei vsync synchron zur Bildwiederholrate des Monitors sein und denkt daran vsync auszuschalten, wenn ihr WaitForFrame benutzt. Weiterhin scheint diese Methode im Gegensatz zu vsync auch so besser zu sein, da Stepmania dann schneller zu reagieren scheint. Liegt wahrscheinlich daran, dass der Prozessor bei dieser Methode statt auf das vsync-signal zu warten und für andere Prozesse unzugänglich zu sein pausiert ist und nicht auf ein Signal warten muss. Und vielleicht kommt das vsync Signal ja verspätet :D

Eine letzte erwähnenswerte Sache ist noch die Animation der Noteskins. Ich persönlich finde die Animation des Receptor Arrows (pfeilschablone oben auf dem Bildschirm) schrecklich. Die Animation dauert viel zu lange und der Pfeil wird dabei viel zu klein.
Die Einstellung kann man in der Datei NoteSkins/common/default/metrics.ini ändern.

Bei mir sieht die so aus:

[ReceptorArrow]
# By default, always step. Individual game skins can override this.
HitMineCommand=
MissCommand=
NoneCommand=zoom,.85;linear,0.0706;zoom,1
BooCommand=zoom,.85;linear,0.0706;zoom,1
GoodCommand=zoom,.85;linear,0.0706;zoom,1
GreatCommand=zoom,.85;linear,0.0706;zoom,1
PerfectCommand=zoom,.85;linear,0.0706;zoom,1
MarvelousCommand=zoom,.85;linear,0.0706;zoom,1

Die Zeit 70.6ms sind genau 6 Frames meiner Refreshrate von 85Hz, man weiss ja nie :P

So das war's. Ich hoffe wer sich daran versucht kommt soweit mit meinem Tutorial zurecht. Falls nicht, werde ich wohl auch nicht mehr großartig Fragen beantworten können, da ich ab 6.9.05 für 10 Monate Austauschschüler in der USA sein werde.


mfg
Scorpion
Antworten

Zurück zu „Simulationen“