2013-11-14 5 views
7

Also, Unity macht nicht viele Rhythmusspiele auf Android. Ich entschloss mich, herauszufinden, warum, und programmiere eins als Aufgabe (die Grundlagen dafür sowieso). Meine wichtigste Hürde ist die Benutzereingabe. Wie wir wissen, basiert die Eingabe auf der Bildrate in der Einheit, und ein Musikspiel (ich nehme an) würde die kleinstmögliche Verzögerung zwischen dem Drücken der Taste und der Aktion bevorzugen.Eingabe eines Rhythmusspiels

Wenn wir Musik mit etwa 15 bis 20ms Verzögerung betrachten, hört das menschliche Ohr, dass etwas "außer Kontrolle" ist.

Ich hörte Android Unity-Spiele mit 30FPS (seit 60FPS saugt die Batterie trocken), einfache Mathematik bedeutet: 1000/30 = 33ms pro Frame. Rechnen wir in den 15ms können wir wohl nicht merken, wir sind bei 18ms möglicher Katastrophe. Angenommen, wir erreichen diese 30 FPS jederzeit.

Wenn ich die Eingabe von einem Benutzer bekomme, kann ich einen Ton auf diesem Eingang auf dem genau gleichen Rahmen spielen. Allerdings könnten wir 18ms frei sein.

Jetzt gibt es eine Möglichkeit, DIRECT-Steuerelemente von Maus und Tastatur zu erhalten, die OnGui() anstelle von Update() verwendet, um Ereignisse der Tastatur oder Mausklicks an Ort und Stelle zu erhalten. Das Problem ist, Android funktioniert wahrscheinlich nicht, (das funktioniert auch nicht für Gamepads) und die Methoden klingen geradezu seltsam, besonders wenn wir versuchen, Sounds von der OnGui() Methode abzuspielen.

Meine Frage: Was würden Sie tun, und warum? Sollten wir nur die möglichen 18ms akzeptieren und annehmen, dass wir die 30FPS erreichen, oder sollten wir nach einem zuverlässigen Weg suchen, um direkt Input zu erhalten, anstatt auf ein Update zu warten?

Danke für jede Einsicht, die Sie mir geben können, ich habe keine Artikel darüber gefunden, die gerade nützlich sind. -Smiley

EDIT Ich habe gerade einige grundlegende Tests mit einem Metronom, bei 100FPS im Editor ausgeführt wird (die 10 ms pro Rahmen sein sollte) meine spacebar innerhalb der Einheit auf einem Metronom tippen. Die Ergebnisse, die ich bekam, waren einfach schrecklich. Schnell klopfen: Ich komme meiner Metronom-Tick so nah wie 20ms, aber nichts näher. Auf den Beat tippen: Ich habe mindestens 200ms von meinem Ziel Tick. Wenn ich nicht mit diesem Rhythmus verwirrt bin, ist das einfach falsch.

Derzeit verwende ich Debug.Log, um meine Testdaten in das Protokoll zu bekommen. Kann mir bitte jemand bestätigen, ob dies der Grund ist (verursacht einige lange Verzögerung? Ich weiß, Debug ist nicht so optimiert), oder ist das Timing eigentlich so schlimm?

Vielen Dank im Voraus, -Smiley

+2

[Zuverlässige Echtzeiteingabe ist ein Problem für Unity] (http://forum.unity3d.com/threads/54154-Realtime-input-in-Unity). Was Ihre persönlichen Tests betrifft, erkennen die meisten Leute nicht, dass 'Debug.Log' ein * extrem * teurer Anruf ist (oft unter 5 + ms). Es lohnt sich oft für die Entwicklung, aber ich würde es für kein Leistungsbenchmarking empfehlen. – rutter

Antwort

2

Erstens würde Ich mag ein paar Dinge auf Ihre Kommentare und Analysen hinzuzufügen:

Es ist eine Hölle von der Messung der Latenzzeit mehr viel zwischen dem taktilen Input und dem, was deine Augen wahrnehmen.

Wahrscheinlich die größte, die ich in Ihren Tests vermisse, ist die Latenz zwischen der Grafikkarte und dem PC-Monitor, auf dem Sie testen. Many common LCD monitors these days have a latency of between 15-30ms in processing lag. Ich weiß nicht, wie viel das mit mobilen Bildschirmen und Hardware zu tun hat, aber ich würde vorschlagen, dass Sie sich die Zeit nehmen, weitere Tests an Ihrer Zielhardware durchzuführen, bevor Sie weitere Schlussfolgerungen ziehen.

Um mehr direkt Ihre Frage zu beantworten:

ich weiterhin würde Unity verwenden aber ich die besten Methoden der Einnahme die Eingabe der Forschung weiterhin und es zurück an den Spieler so schnell wie möglich füttern. In den obigen Kommentaren hat @rutter Sie auf etwas hingewiesen, was ein ziemlich guter thread on the issue zu sein scheint.

Von bestimmten Hinweis würde ich mit FixedUpdate() betrachten, um die Framerate des Spiels von der Eingangsverarbeitungsgeschwindigkeit zu entkoppeln.

Ich denke, es lohnt sich auch, Zeit in die Erforschung der Psychologie der Latenzwahrnehmung zu investieren. Zum Beispiel, wenn Ihr Spiel eine Art Guitar Hero-Spiel ist, das dem spielenden Lied entspricht, können Sie einfach die Verzögerung berücksichtigen, die Sie wissen, und es in Ihrer Spiellogik berücksichtigen, wenn Sie die Eingabe überprüfen.

+0

Das hört sich nach einem guten Plan an, leider endete meine Forschung, und ich habe keine Werkzeuge, um genauer zu "messen", als ich es tue. An diesem Punkt wird es eher ein Ratespiel für mich, weil ich keine Werkzeuge habe, um den Unterschied einer Maschine zu messen. Ich würde gerne später auf meine Karriere zurückkehren. – Smileynator

0

Ich denke, dass Sie dies zu komplizieren, und dass das Genauigkeitsproblem nicht annähernd so schlimm ist wie Sie denken.

Normalerweise drücken die Leute die Tasten etwas früher, um zu synchronisieren, was sie sehen und hören.

Es hängt auch viel auf, wenn Sie irgendeine Art haben Anzeige zu scrollen, dass sie zusammenpassen versuchen ... wenn das Display bei 30fps Scrollen sanft (ohne große Sprünge) sie sind sie noch in der Lage ihr Timing zu machen drückt ziemlich genau.

Ich würde vermuten, dass obwohl Menschen hören können, wenn ihr Timing ausgeschaltet ist, ist ihr tatsächliches Timing des Treffens der Tasten zur genau richtigen Zeit sowieso nicht so genau.

Hier ist eine andere einfache Lösung ... die denke ich ist, was Rockband und Gitarre Held oft tun ... Sie starten die Note/Sound zur richtigen Zeit sowieso .... dann ändern Sie es zu a gebrochener Ton, wenn Sie feststellen, dass sie es verpasst oder vermasselt haben.

Verwandte Themen