Unity veröffentlichte am 7. Januar 2015 einen technischen Beitrag zu reproduzierbaren Zufallswerten in der prozeduralen Spielentwicklung. Im Mittelpunkt steht die Frage, wie Level und Welten bei gleicher Ausgangslage erneut mit denselben Ergebnissen erzeugt werden können. Die Methode eignet sich laut Unity nicht für kryptografische Anwendungen.
RNG erzeugt eine feste Zahlenfolge
Ein klassischer Zufallszahlengenerator arbeitet mit einem Startwert, dem sogenannten Seed. Derselbe Seed erzeugt dieselbe Folge. Das ist für Spiele nützlich, wenn eine prozedural erzeugte Welt später erneut geladen werden soll. Unity beschreibt dabei ein Problem: Der Generator liefert Werte in einer festen Reihenfolge. Ein einzelner Wert aus der Mitte der Folge lässt sich nicht sauber abfragen, ohne die vorherigen Werte zu erzeugen.
Bei einer großen Welt, die abschnittsweise während des Spielens entsteht, kann diese Einschränkung zu unnötigem Aufwand führen. Wird ein Abschnitt aus dem Speicher entfernt und später erneut betreten, muss der Generator denselben Zustand wieder erreichen. Unterschiedliche Seeds lösen das Problem nicht automatisch, weil gleich positionierte Werte aus verschiedenen Folgen laut Unity erkennbare Muster bilden können.
Hashfunktionen greifen gezielt auf Weltkoordinaten zu
Für diesen Anwendungsfall stellt Unity Hashfunktionen als Alternative vor. Eine Hashfunktion kann aus einer Eingabe wie einer Position eine reproduzierbare Zahl ableiten. Die Abfragen müssen dabei nicht in einer bestimmten Reihenfolge erfolgen. Das passt zu Welten, deren Bereiche unabhängig voneinander geladen, verworfen und später wieder erzeugt werden.
Als Vergleich nennt der Beitrag unter anderem MD5 und xxHash. Die Tests bescheinigen beiden Verfahren ähnliche Eigenschaften bei der untersuchten Zufallsverteilung, während xxHash ungefähr 50-mal schneller als MD5 arbeitet. Unity empfiehlt eine für prozedurale Inhalte optimierte xxHash-Implementierung. Sie vermeidet unter anderem unnötige Umwandlungen zwischen Ganzzahlen und Bytefolgen sowie Schleifen für häufige Eingaben mit ein bis drei Werten.
Hash und RNG lassen sich kombinieren
Für eine große Gitterwelt schlägt Unity eine Kombination vor: Eine Hashfunktion erzeugt aus den Koordinaten eines Abschnitts einen Seed. Ein Zufallszahlengenerator füllt anschließend diesen Abschnitt mit einer Folge von Werten. So bleibt der Inhalt eines Bereichs reproduzierbar, während die Werte innerhalb des Bereichs in der benötigten Reihenfolge entstehen. Die technische Betrachtung ergänzt die früheren Unity-Arbeiten zum Occlusion Culling um einen weiteren Baustein für die Entwicklung interaktiver Welten.
